作为练习,我try 实现合并排序算法.这是我的代码:
#include <stdio.h>
void printArray(int *array) {
int i;
for (i=0; i<20; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
void merge(int *array, int *temp, int left, int mid, int right) {
int i=left, j=mid, k=left;
while (i<mid && j<right) {
if (array[i] > array[j]) {
temp[k++]=array[j++];
} else {
temp[k++]=array[i++];
}
}
while (i<mid) {
temp[k++]=array[i++];
}
while (j<right) {
temp[k++]=array[j++];
}
for (i=left; i<right; i++) {
array[i]=temp[i];
}
}
void mergeSort(int *array, int size) {
int temp[size];
int i,j;
for (j=1; j<=size; j*=2) {
printf("\n%d\n",j);
for (i=0; i<size; i+=2*j) {
if (i+2*j<size) {
merge(array,temp, i, i+j, i+2*j);
} else {
merge(array,temp, i, i+j, size);
}
}
}
}
int main() {
int array[] = {83,86,77,15,93,35,86,92,49,21,62,27,90,59,63,26,40,26,72,36};
printArray(array);
mergeSort(array, 20);
printArray(array);
}
在mergeSort
内,我预计f
的迭代会在f
等于16时停止,因为size
等于20,但实际上它上升到8;事实上,列表并不是完全有序的.以下是输出:
83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36
1
2
4
8
15 21 26 27 35 49 59 62 63 77 83 86 86 90 92 93 26 36 40 72
然后,我try 编译相同的代码,将GCC的优化选项设置为O1、O2或O3,得到了我预期的结果:
83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36
1
2
4
8
16
15 21 26 26 27 35 36 40 49 59 62 63 72 77 83 86 86 90 92 93
怎么一回事?