>第 11 章 排序与查找>插入排序

bsdwiki admin.cloud@gmail.com
2009-03-26 15:25:46

作为一个半吊子学员,看了很多有关排序的例程,感觉这是所有看过例程中可读性最差,读起来巨郁闷,最让人匪夷所思的写法,跟前几章精炼简要的讲解风格大相径庭


宋劲杉 songjinshan@akaedu.org
2009-03-27 09:26:25

这个排序例程,去掉调试信息就七行代码,就算我再怎么发挥又能有多匪夷所思呢?别人书上的插入排序都是怎么写的呢?


Laciq 530107999@qq.com
2009-06-22 18:20:08

使用全局部分应该用来声明常量,而不是用来声明变量。
全局部分声明变量是不符合数据封装与数据隐藏的。


laciqs 530107999@qq.com
2010-04-30 21:01:49

把int a[LEN] = { 10, 5, 2, 4, 7 };
中的7改为2,排序结果就不正确了。


laciqs 530107999@qq.com
2010-04-30 21:07:24

刚才说错了,是正确的,把测试代码和结果看混了,实在不好意思。


牛肉丸 niurow@qq.com
2010-10-01 15:13:26

一楼要说的是 这个逻辑十分难理解。。。


牛肉丸 niurow@qq.com
2010-10-01 15:16:57

这个关键在于排好的序列,,,在排好的序列中逐一比较,,然后插入。。。


USOPP cuisanzhang@163.com
2011-06-11 09:38:59

请问为什么我看不懂呢
while (i >= 0 && a[i] > key) {
	a[i+1] = a[i];
	i--;
}
a[i+1] = key;


如果a[i]比key大
那么a[i+1] = a[i]
那么就是说a[i]=a[j]
a[j]就会被覆盖啊 

想了几天都没明白 诶 看来我很笨啊


USOPP cuisanzhang@163.com
2011-06-11 10:16:45

现在好像懂了....一点


wangzhengyi 15866883396@126.com
2011-10-10 00:34:43

临睡前给楼上分析一下这个代码,(1)首先a【j】的数值在while循环前已经赋值给了key这个变量,所以首先不会存在覆盖的问题。(2)while循环的内容是比较大小,如果a[1]大于a[2],则将a[1]的值附给a[2],而a[1]的值等于a[2]了。(3)然后i--,只要i>=0,则继续循环,继续上述过程,总之一定会让所有数都有序(4)将kye的值赋值给最后一个调换的元素即可。不知道我这样说,你是否能够清除,不管你信不信,反正我懂了


wangzhengyi 15866883396@126.com
2012-01-26 22:26:53

重新看到这里,发现上次竟然是自己的留言,做几点补充吧
(1)首先插入排序关键要理解要插入的数组已经有序
(2)当只有一个元素是必然是有序,所以J从1开始取值,对应数组的第二个元素
(3)每次的while循环关键不在于排序,而是找到要插入数据应该放置的位置
(4)while结束循环后,j为当前小于要插入数据的位置,因此要插入数据的位置应为j+1
(5)每次循环涉及到数据位置的替换,并没有需要增加数据,只是找到数据应该放置的位置
以上5点算是我的补充,希望以后的同学也能纠正我存在的错误观点


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!