作为一个半吊子学员,看了很多有关排序的例程,感觉这是所有看过例程中可读性最差,读起来巨郁闷,最让人匪夷所思的写法,跟前几章精炼简要的讲解风格大相径庭
这个排序例程,去掉调试信息就七行代码,就算我再怎么发挥又能有多匪夷所思呢?别人书上的插入排序都是怎么写的呢?
使用全局部分应该用来声明常量,而不是用来声明变量。 全局部分声明变量是不符合数据封装与数据隐藏的。
把int a[LEN] = { 10, 5, 2, 4, 7 };
中的7改为2,排序结果就不正确了。刚才说错了,是正确的,把测试代码和结果看混了,实在不好意思。
一楼要说的是 这个逻辑十分难理解。。。
这个关键在于排好的序列,,,在排好的序列中逐一比较,,然后插入。。。
请问为什么我看不懂呢
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]就会被覆盖啊
想了几天都没明白 诶 看来我很笨啊
现在好像懂了....一点
临睡前给楼上分析一下这个代码,(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的值赋值给最后一个调换的元素即可。不知道我这样说,你是否能够清除,不管你信不信,反正我懂了
重新看到这里,发现上次竟然是自己的留言,做几点补充吧 (1)首先插入排序关键要理解要插入的数组已经有序 (2)当只有一个元素是必然是有序,所以J从1开始取值,对应数组的第二个元素 (3)每次的while循环关键不在于排序,而是找到要插入数据应该放置的位置 (4)while结束循环后,j为当前小于要插入数据的位置,因此要插入数据的位置应为j+1 (5)每次循环涉及到数据位置的替换,并没有需要增加数据,只是找到数据应该放置的位置 以上5点算是我的补充,希望以后的同学也能纠正我存在的错误观点
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!