#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int FindMid(int array[], int n) {
int i;
int m = 0;
for (i = 0; i < n; i++) {
if (i < n - 1 && array[i] > array[i + 1])
m = i + 1;
}
return m;
}
void MySort(int array[], int n) {
int i = 0;
int l = 0;
int t = FindMid(array, n);
int m = t;
int k = 0;
int *temp = (int *)malloc(sizeof(int) * n * 2);
for (i = 0; i < n; i++) {
temp[i] = 0;
}
while (l < m && m < n) {
if (array[l] <= array[m]) {
temp[k++] = array[l++];
} else {
temp[k++] = array[m++];
}
}
while (l < t) {
temp[k++] = array[l++];
}
while (m < n) {
temp[k++] = array[m++];
}
for (i = 0; i < n; i++) {
array[i] = temp[i];
}
free(temp);
}
void print_ary(int *pa, int n) {
int i;
for (i = 0; i < n; i++) {
printf("%d ", pa[i]);
}
printf("\n");
}
int main(void) {
int arrayone[13] = {1, 6, 9, 16, 21, 2, 5, 11, 19, 25, 30, 33, 40};
int arraytwo[13] = {1, 6, 9, 16, 21, 25, 30, 33, 40, 2, 5, 11, 19};
int a = 13;
MySort(arrayone, a);
print_ary(arrayone, a);
MySort(arraytwo, a);
print_ary(arraytwo, a);
return 0;
}
根据代码,arrayone 的输出和 arraytwo 的输出应该是相同的,但产生了不同的输出。第一次传递 while 语句时,m 的值应该保持添加状态,但似乎编译是在 m 的值初始化的情况下继续进行的。
while(m<n){temp[k++]=array[m++]}
我认为这就是问题所在。我该如何解决它?`
预期(我想要)
1 2 5 6 9 11 16 19 21 25 30 33 40
1 2 5 6 9 11 16 19 21 25 30 33 40
输出(实际)
1 2 5 6 9 11 16 19 21 2 5 11 19
1 2 5 6 9 11 16 19 21 25 30 33 40
while (m < n) {
temp[k++] = array[m++];
}
// Instead of this code
for (i = 0; i < n; i++) {
if (temp[k - 1] < array[i]) {
while (k < n) {
temp[k++] = array[k++];
}
}
}
我使用这段代码重新编译,结果是一样的。即使我想从 chatgpt 得到提示,它仍然给出相同的答案。
TLDR:
更改此:
while (l < m && m < n) {
对此:
while (l < t && m < n) {
说明:
如果我正确地阅读了您的代码,您的 MySort 函数将采用一个具有两个递增序列的数组。然后将数组排序为统一的递增序列。
例如
(10,20,30, 1,11,21) => {1,10,11,20,21,30}
这是你的错误:
while (l < m && m < n) {
if (array[l] <= array[m]) {
temp[k++] = array[l++];
}
else {
temp[k++] = array[m++];
}
}
代码同时将
l
与 m
(指定的中点)进行比较,但也使用 m
作为数组右半部分的迭代索引。因此 m
在循环的某些序列上会递增,但 l<m
比较永远不会期望 m
发生变化。
您只需要比较
l < t
而不是l < m
。见上文。