在做清华OJ上的一道题时, 写了一个归并排序,代码如下:
1 void MergeSort(int x[], int y[], int lo, int hi) 2 { 3 /* 4 *归并排序函数,以 x[] 为标准排序 5 */ 6 7 if(lo < hi) 8 { 9 int mi = (lo + hi) >> 1 ; 10 11 MergeSort(x, y, lo, mi) ; 12 MergeSort(x, y, mi+1, hi); 13 Merge(x, y, lo, mi, hi); 14 } 15 } 16 17 18 void Merge(int x[], int y[], int lo, int mi, int hi) 19 { 20 /* 21 *归并操作,隶属于MergeSort函数 22 */ 23 24 int length_1 = mi - lo + 1, length_2 = hi - (mi + 1) + 1; 25 26 int A[length_1], B[length_2], C[length_1], D[length_2]; 27 28 int i = 0, j = 0; 29 for (i = 0; i < length_1; ++i) { C[i] = x[lo+i]; A[i] = y[lo+i]; } 30 for (j = 0; j < length_2; ++j) { D[j] = x[mi+1+j]; B[j] = y[mi+1+j]; } 31 32 i=0, j=0; int t=lo; 33 while ((i < length_1) && (j < length_2)) 34 { 35 if (C[i]<D[j]) {y[t++] = A[i++]; x[t-1] = C[i-1];} 36 else {y[t++] = B[j++]; x[t-1] = D[j-1];} 37 } 38 39 while (i<length_1) {y[t++] = A[i++]; x[t-1] = C[i-1];} 40 while (j<length_2) {y[t++] = B[j++]; x[t-1] = D[j-1];} 41 }
这段代码过了OJ上的上一道题,但是用在现在这道题目中却发现了问题。使用这段代码进行一次排序操作后,如果再进行排序,结果就会不对。
如:a[],b[],c[],d[] 是四个符合题意的数组,有以下代码:
MergeSort(a, b, 0, n); MergeSort(c, d, 0, n);
用sublime + gcc 编译:
a,b排序正确,c,d却会发生错误。
用vs2013编译:
a, b, c, d均排序错误。
时间: 2024-12-17 22:07:37