希尔排序(shell)
希尔排序是不稳定的
主要思想借用了合并排序的思想。不过他不是左边一半右边一半,而是按照步长来分,随着步长减少,分成的组也越少。然后进行各组的插入排序
换句话说,就是按照步长从大到小最后到1的过程,为每次循环都做插入排序。比如按步长为8设置分组,对各个分组进行插入排序,再按步长为4设置分组,对各个分组进行插入排序,再按步长为2设置分组,对各个分组进行插入排序,最后按步长为1分组并插入排序(此时就是最原始的插入排序,但是由于每一次分组并对各个分组的排序时都使用到了上一次排序的过程结果,因此是对插入排序的优化)。
Shell排序的时间性能优于直接插入排序 !
举个百度上的例子:
排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止
初始:d=5
49 38 65 97 76 13 27 49* 55 04
49 13 —————由于第一个数大于第1+5个数,于是对这个分组插入排序,得到13,49的序列,也就是交换两者!
|-------------------|
38 27
|-------------------|
65 49*
|-------------------|
97 55
|-------------------|
76 04
|-------------------|
一趟结果
13 27 49* 55 04 49 38 65 97 76
d=3
13 27 49* 55 04 49 38 65 97 76
13 55 38 76 ——————————按步长为3得到第一个分组13 55 38 76,插入排序后得到13 38 55 76,于是将排好的序列放入原来的四个位置上
|------------|------------|------------|
27 04 65
|------------|------------|
49* 49 97
|------------|------------|
二趟结果
13 04 49* 38 27 49 55 65 97 76
d=1 ————————————————最后使用步长为1的分组,也就是最原始的插入排序,在原来的基础上基本有序,因此效率很高。
13 04 49* 38 27 49 55 65 97 76
|----|----|----|----|----|----|----|----|----|
三趟结果
04 13 27 38 49* 49 55 65 76 97