关于归并排序的问题
时间:2011-07-14
来源:互联网
偶有一个归并排序的实现:
C/C++ code
偶不明白为什么是if (start < end - 1),而不是if (start < end),也许可以简单回答说是因为LEN本来就比数组最大下标多1,但是改了这个条件不仅仅影响到涉及到数组最大下标的那次合并啊?为什么之前的那些也正确呢?
为了使用merge_sort(0, LEN-1);
我把上述代码改成:
C/C++ code
这就和《算法导论》上的差不多了,但又引出新问题了:为什么这里必须是merge_sort(mid+1, end);而之前那个代码却必须是merge_sort(mid, end);?
调试了半天也没搞明白,请求各位帮助,谢谢。
C/C++ code
void merge_sort(int start, int end) { if (start < end - 1) { int mid = (start + end) / 2; int i = start, j = mid, k = start; merge_sort(start, mid); merge_sort(mid, end); while (i < mid || j < end) if (j == end || (i < mid && a[i] <= a[j])) t[k++] = a[i++]; else t[k++] = a[j++]; for (i = 0; i < end; i++) a[i] = t[i]; } } int main(void) { merge_sort(0, LEN); return 0; }
偶不明白为什么是if (start < end - 1),而不是if (start < end),也许可以简单回答说是因为LEN本来就比数组最大下标多1,但是改了这个条件不仅仅影响到涉及到数组最大下标的那次合并啊?为什么之前的那些也正确呢?
为了使用merge_sort(0, LEN-1);
我把上述代码改成:
C/C++ code
void merge_sort(int start, int end) { if (start < end) { int mid = (start + end) / 2; int i = start, j = mid, k = start; merge_sort(start, mid); merge_sort(mid+1, end); while (i < mid || j <= end) if (j == end + 1 || (i < mid && a[i] <= a[j])) t[k++] = a[i++]; else t[k++] = a[j++]; for (i = 0; i <= end; i++) a[i] = t[i]; } }
这就和《算法导论》上的差不多了,但又引出新问题了:为什么这里必须是merge_sort(mid+1, end);而之前那个代码却必须是merge_sort(mid, end);?
调试了半天也没搞明白,请求各位帮助,谢谢。
作者: laciqs 发布时间: 2011-07-14
理由很简单,假设start=0, 原先mid=LEN/2,现在mid=(LEN-1)/2,当LEN=10是 mid=5才正确。
作者: xibeitianlang 发布时间: 2011-07-14
下标的问题,算法导论上归并有两种:使用哨兵位和不适用。
具体代码参考:http://blog.csdn.net/dizuo/article/details/6057479
具体代码参考:http://blog.csdn.net/dizuo/article/details/6057479
作者: dizuo 发布时间: 2011-07-14
路过,学习
作者: students_lcc 发布时间: 2011-07-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28