算法4:插入排序和選擇排序算法的比較

排序算法列表電梯

插入排序算法和選擇排序算法的復(fù)雜度分析:

插入排序和選擇排序都有兩層循環(huán)掏缎,外循環(huán)遍歷整個數(shù)組,內(nèi)循環(huán)稍有區(qū)別:

  • 選擇排序的內(nèi)循環(huán)是遍歷一組未排過序的數(shù)組,
  • 插入排序的內(nèi)循環(huán)是遍歷一組已排過序的數(shù)組答恶,

在此基礎(chǔ)上蔚晨,進(jìn)行比較或交換齿诞。看起來已經(jīng)排序過的數(shù)組中進(jìn)行插入會感覺性能要好一點(diǎn)乞巧,實(shí)際未必,這要看數(shù)組的具體情況摊鸡,比如最壞情況下所有數(shù)組元素都得過一遍绽媒。

插入排序在插入的時候可以做交換操作,也可以不做交換免猾。

改進(jìn)插入排序算法可以使用二分法等是辕,這里只探討普通的插入排序。

算法復(fù)雜度

算法 最好情況 最壞情況
選擇排序 交換0次猎提,比較n(n-1)/2次 交換N次
插入排序 交換0次获三,比較N-1次 交換n(n-1)/2次,比較n(n-1)/2次

看過一些教材,普遍說插入排序算法比選擇排序要快石窑,實(shí)際上從上面的分析可以看出牌芋,其實(shí)二者的復(fù)雜度差不多,都是O(N平方)松逊。后面的代碼實(shí)現(xiàn)測試中也證實(shí)了這一點(diǎn)躺屁。

插入排序和選擇排序算法的比較:

我們的python測試程序,考慮了不同大小的數(shù)組排序:

  • 1000
  • 10000
  • 20000

每種又考慮了三種情況:

  • 隨機(jī)生成數(shù)
  • 最好情況:原數(shù)組已從小到大排好
  • 最壞情況:原數(shù)組已從大到小排好

并與python自帶的sort方法作了比較经宏。

完整代碼如下:

sizes = [
        1000,
        5000,
        10000
        ]

for size in sizes:
    # random generation of items to be sorted
    items = range
    print "-"*10 + "sorting numbers" + "-"*10
    items = []
    for i in range(0,size):
        items.append(random.randint(2,999))
    #print "original items: %r" % items
    # the worse case
    items_worse = range (size-1,-1,-1)
    # the best case
    items_best = range(0,size)

    to_be_sorted = [
            ("random case",items),
            ("worse case",items_worse),
            ("best case",items_best)
            ]

    def duration(sort_method):    
        # calculate execution time for our selection sort method
        start = time.clock()
        sort_method.sort()
        end = time.clock()
        duration = end - start
        return duration

    for item in to_be_sorted:
        temp = copy.deepcopy(item) # for reversing use after a certain sort
        print "-"*10 + item[0] + "-"*10
        # calculate duration for insertion sort
        insertion_sort = InsertionSort(item[1])
        dinsertion = duration(insertion_sort)
        item = temp
        # calculate duration for selection sort    
        selection_sort = SelectionSort(item[1])
        dselection = duration(selection_sort)
        item = temp
        # calculate duration for python builtin sort
        dpython = duration(item[1])
        print "%s: %ds" % ("insertion sort",dinsertion)
        print "%s: %ds" % ("selection sort",dselection)
        print "%s: %ds" % ("python built-in",dpython)

運(yùn)行結(jié)果:

size = 1000:挺不錯犀暑,都是毫秒級,但是看不出區(qū)別

----------random case----------
item len: 1000
insertion sort: 0s
selection sort: 0s
python built-in: 0s
----------worse case----------
item len: 1000
insertion sort: 0s
selection sort: 0s
python built-in: 0s
----------best case----------
item len: 1000
insertion sort: 0s
selection sort: 0s
python built-in: 0s

size=10000: 有區(qū)別了烁兰,但是很少耐亏,1s差別。不過可以明顯看出沪斟,最好情況下選擇排序卻用了6s多广辰,最壞情況下,插入排序比選擇排序慢了主之。

----------random case----------
item len: 10000
insertion sort: 6s
selection sort: 7s
python built-in: 0s
----------worse case----------
item len: 10000
insertion sort: 8s
selection sort: 7s
python built-in: 0s
----------best case----------
item len: 10000
insertion sort: 0s
selection sort: 6s
python built-in: 0s

size=20000: 兩種排序算法的耗時都明顯提高了择吊,但差別除了最好情況,差別仍然不大槽奕,基本說明二者的復(fù)雜度是差不多的几睛。python自帶的sort方法仍是毫秒級,過段時間等其他排序算法學(xué)了后研究下源碼粤攒。

----------random case----------
item len: 20000
insertion sort: 30s
selection sort: 33s
python built-in: 0s
----------worse case----------
item len: 20000
insertion sort: 39s
selection sort: 33s
python built-in: 0s
----------best case----------
item len: 20000
insertion sort: 0s
selection sort: 32s
python built-in: 0s
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末所森,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夯接,更是在濱河造成了極大的恐慌焕济,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盔几,死亡現(xiàn)場離奇詭異吼蚁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)问欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門可帽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垮斯,“玉大人伐厌,你說我怎么就攤上這事定嗓。” “怎么了注整?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵能曾,是天一觀的道長度硝。 經(jīng)常有香客問我,道長寿冕,這世上最難降的妖魔是什么蕊程? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮驼唱,結(jié)果婚禮上藻茂,老公的妹妹穿的比我還像新娘。我一直安慰自己玫恳,他們只是感情好辨赐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著京办,像睡著了一般掀序。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惭婿,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天不恭,我揣著相機(jī)與錄音,去河邊找鬼财饥。 笑死换吧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佑力。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筋遭,長吁一口氣:“原來是場噩夢啊……” “哼打颤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漓滔,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤编饺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后响驴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體透且,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年豁鲤,在試婚紗的時候發(fā)現(xiàn)自己被綠了秽誊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡琳骡,死狀恐怖锅论,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情楣号,我是刑警寧澤最易,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布怒坯,位于F島的核電站,受9級特大地震影響藻懒,放射性物質(zhì)發(fā)生泄漏剔猿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一嬉荆、第九天 我趴在偏房一處隱蔽的房頂上張望归敬。 院中可真熱鬧,春花似錦员寇、人聲如沸弄慰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陆爽。三九已至,卻和暖如春扳缕,著一層夾襖步出監(jiān)牢的瞬間慌闭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工躯舔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驴剔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓粥庄,卻偏偏與公主長得像丧失,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惜互,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 排序算法 冒泡排序 選擇排序 插入排序 快速排序(最常見) 希爾排序 歸并排序 源碼:Sorting 冒泡排序 冒...
    廖少少閱讀 2,722評論 12 101
  • 總結(jié)一下常見的排序算法布讹。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序训堆。外排序:指在排序...
    jiangliang閱讀 1,346評論 0 1
  • 概述 排序有內(nèi)部排序和外部排序描验,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大坑鱼,一次不能容納全部...
    蟻前閱讀 5,184評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序膘流,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大鲁沥,一次不能容納全部...
    每天刷兩次牙閱讀 3,732評論 0 15
  • 時光荏苒呼股,過往變成了永遠(yuǎn)觸摸不到的回憶!馬上又要有新的開端画恰,啟程卖怜,始向未知的遠(yuǎn)方!2妗B砜俊Q俪椤! 也許甩鳄,有些東西將是我無...
    加菲貓is胖紙閱讀 259評論 0 0