标签:
在做清华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均排序错误。
标签:
原文地址:http://www.cnblogs.com/newraina/p/4382510.html