码迷,mamicode.com
首页 > 其他好文 > 详细

记录一个错误

时间:2015-04-01 09:23:22      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

在做清华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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!