复习一下插入排序和希尔排序

来源:互联网 发布:2017年php好找工作吗 编辑:程序博客网 时间:2024/06/03 19:47

首先是插入排序


for (i = 1; i < n; i++)
for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)
Swap(a[j], a[j + 1]); 

如果完全按照插入排序的思维,先插入,再后推,程序语句块会变得比较臃肿

这里用多次swap的方法,可以让项一步一步往前移动,语句块就简洁很多,效果和时间上是一样的

================================

然后是希尔排序

for(gap=n/2;gap>0;gap/=2)

for (i = gap; i < n; i++)  

for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
Swap(a[j], a[j + gap]);


以,a[10]为例

1.gap=10/2=5,分成5组,步进为5
a0,a5
a1,a6
a2,a7
a3,a8

a4,a9

2.gap=5/2=2,分成2组,步进是2

a0 a2 a4 a6 a8
a1 a3 a5 a7 a9

3.gap=2/2=1,分成1组,步进为1

a0,a1,a2,a3,a4,a5,a6,a7,a8,a9

4.整体再进行一次插入排序,上面代码我为了对比工整一点,没加这一步,添加上就可以了

=======================================

PS,以前刚学希尔的时候问过老师,为什么这里选插入不是冒泡

那么既然是复习,也再提一点冒泡和插入的区别

一个int数组为,2,5,199,1

他是一个比较规则的数组,如果用冒泡,那他必须一步一步不断交换位置,最后让1到2的前面

1会先和2换位置,然后到了最后位置的2又会和5换位置

插入排序就只要换一次就可以了,希尔排序时一个把数组逐渐变得有序的过程,所以用插入


可以看到,希尔排序对比插入排序主要是添加了一个步进的概念(嗯,步进,让人回忆起了单片机的内容,23333)

把这两个的思路放在一起,就会变得简单明了啦