排序算法-03希尔排序(python实现)
生活随笔
收集整理的這篇文章主要介紹了
排序算法-03希尔排序(python实现)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
希爾排序
- 簡(jiǎn)述
- 希爾排序又稱之為縮小增量排序,從思維導(dǎo)圖(冒泡排序的博客)可以得知,這也是一種插入排序,事實(shí)上,它就是直接插入排序的加強(qiáng)優(yōu)化版本。
- 過(guò)程描述
- 下面的敘述按照維基百科的例子來(lái)解釋,有一個(gè)數(shù)據(jù)序列為[13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10]。
- 首先,設(shè)定一個(gè)步長(zhǎng)5,進(jìn)行排序。
- 此時(shí)序列為4行5列:
- [13, 14, 94, 33, 82,
?25, 59, 94, 65, 23,?
?45, 27, 73, 25, 39,?
?10] - 對(duì)每一列進(jìn)行排序。
- [10, 14, 73, 25, 23,
?13, 27, 94, 33, 39,?
?25, 59, 94, 65, 82,?
?45] - 排序后序列為[10, 14, 73, 25, 23, 13, 27, 94, 33, 39, 25, 59, 94, 65, 82, 45]
- 接著,再以3為步長(zhǎng)進(jìn)行排序。
- 此時(shí)序列為5行3列:
- [10, 14, 73,
?25, 23, 13,?
?27, 94, 33,?
?39, 25, 59,?
?94, 65, 82,?
?45] - 對(duì)每一列進(jìn)行排序。
- [10, 14, 13,
?25, 23, 33,?
?27, 25, 59,?
?39, 65, 73,?
?45, 94, 82,?
?94]
- 最后,以1為步長(zhǎng)進(jìn)行排序,此時(shí)就是一個(gè)直接插入排序了。
- 不難發(fā)現(xiàn),步長(zhǎng)的選擇是希爾排序的重要部分,Donald Shell(算法提出者)建議使用序列長(zhǎng)度的一半作為初始步長(zhǎng)(也就是N/2)并不斷取半直到到達(dá)1,盡管還有優(yōu)化的余地,這里就不介紹了。
- 算法最開(kāi)始以一定的步長(zhǎng)進(jìn)行排序,然后會(huì)繼續(xù)以更小的步長(zhǎng)進(jìn)行排序,最終算法一定是以步長(zhǎng)為1進(jìn)行排序。當(dāng)步長(zhǎng)為 1 時(shí),算法變?yōu)橹苯硬迦肱判?#xff0c;這就保證了數(shù)據(jù)一定會(huì)被全部排序。
-
復(fù)雜度
排序名稱最好情況最壞情況平均情況 希爾排序 ? O(n^2) O(nlogn) - 特點(diǎn)
- 希爾排序有效減少了排序的趟數(shù),因?yàn)椴粩嗍沟眯蛄谢居行?#xff0c;在上一篇直接插入排序中我提到,序列本身越是有序,排序效率越高,經(jīng)過(guò)之前的步長(zhǎng)處理,最后一趟直接插入排序是很高效的。
- 希爾排序低步長(zhǎng)排序結(jié)果在高步長(zhǎng)狀態(tài)下依然有序。
- 步長(zhǎng)序列的不同直接導(dǎo)致了算法復(fù)雜度變化。
- 希爾排序相同數(shù)據(jù)有可能交換位置,是不穩(wěn)定的,之前的直接插入是穩(wěn)定的。同時(shí),直接插入對(duì)鏈?zhǔn)酱鎯?chǔ)數(shù)據(jù)也合適,但是,由于二維數(shù)據(jù)變換,希爾排序是不能的。
具體可以查看我的github。
總結(jié)
以上是生活随笔為你收集整理的排序算法-03希尔排序(python实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据分析与挖掘理论-数据探索
- 下一篇: 排序算法-04快速排序(Python实现