日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

排序算法-03希尔排序(python实现)

發(fā)布時(shí)間:2024/4/11 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法-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ù)變換,希爾排序是不能的。
# -*- coding:UTF-8 -*- """ 本模塊完成數(shù)據(jù)序列的希爾排序 """def ShellSort(data=[1, 2, 3, 4, 5]):length = len(data)gap = length // 2while gap > 0:for i in range(gap, length):j = i - gaptemp = data[i]# 對(duì)每一列進(jìn)行排序,就是直接插入的思路while j >= 0 and temp < data[j]:data[j+gap] = data[j]j -= gapdata[j+gap] = tempprint("以步長(zhǎng)為{}進(jìn)行,結(jié)果為:".format(gap), data)gap //= 2return Noneif __name__ == '__main__':testData = [10, 14, 73, 25,23, 13, 27, 94,33, 39, 25, 59,94, 65, 82, 45]ShellSort(testData)

具體可以查看我的github。

總結(jié)

以上是生活随笔為你收集整理的排序算法-03希尔排序(python实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。