请用if-else if
2011-10-04 13:59 justvi 阅读(280) 评论(0) 编辑 收藏 举报话说在写归并排序的时候,碰到了问题,因为gdb用得不太熟练,折腾了半天,才搞明白为什么出了问题。
且看以下代码:
1 void merge(int *a, int l, int m, int u)
2 {
3 int lstart = l;
4 int lend = m;
5 int rstart = m + 1;
6 int rend = u;
7 int n = u - l + 1;
8 int *temp = (int *)malloc(sizeof(int) * n);
9 int i;
10 for (i = 0; lstart <= lend && rstart <= rend; ++i)
11 {
12 if (a[lstart] <= a[rstart])
13 temp[i] = a[lstart++];
14 if (a[lstart] > a[rstart])
15 temp[i] = a[rstart++];
16 }
17 while (lstart <= lend)
18 temp[i++] = a[lstart++];
19 while (rstart <= rend)
20 temp[i++] = a[rstart++];
21 memcpy(a+l, temp, n * sizeof(int));;
22 free(temp);
23 temp = NULL;
24 }
这是开始时写的一个函数,但是不知道为什么总是不能得出正确结果,纠结了半天后来将第14行换为:
else if (a[lstart] > a[rstart])
就正确了。在第一个版本中,两个if后的条件都要进行判断,由于在第一个if的执行体中lstart有加1的动作会影响到第二个if的判断,所以会影响到结果。
作者:justvi
出处:http://www.cnblogs.com/justvi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章正文中给出原文连接,否则保留追究法律责任的权利
出处:http://www.cnblogs.com/justvi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章正文中给出原文连接,否则保留追究法律责任的权利