排序算法——希尔排序 Shell Sort

希尔排序(ShellSort)也称递减增量排序算法,其实它是插入排序的优化版本。希尔排序是非稳定排序算法。

希尔排序对插入排序的以下两点进行改进:

(1)插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;

(2)一般来说插入排序是低效的,因为插入排序每次只能将数据移动一位。

原始的算法实现在最坏的情况下需要进行O(n^2)的比较和交换。V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(n(logn)^2)。这比最好的比较算法的O(n log n)要差一些。

希尔排序通过将待排序序列按步长划分成几个序列来提高插入排序的性能,经过划分,使得在排序时,每次一个元素可以一次性的朝其最终位置前进一大步,而不是插入排序中的每次一步。在一趟排序后,再把步长减小,按新的步长重新划分刚得到的新序列,然后再对划分的各序列进行插入排序。如此往复,直到步长减小到1,就可以得到最终所求的有序序列了。

例如对输入数组[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],初始步长取5,即每隔5个元素取一个元素构造子序列,则可划分成

13 25 45 10

14 59 27

94 94 73

33 65 25

82 23 39

对每个子序列应用插入排序,得到

10 13 25 45

14 27 59

73 94 94

25 33 65

23 39 82

然后将上面几个子序列按列拼接起来,得到[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。

然后将步长减小为3,重新划分,得到下面的子序列

10 25 27 39 94 45

14 23 94 25 65

73 13 33 59 82

对各子序列应用插入排序,得到

10 25 27 39 45

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章