排序算法之插入排序,玩撲克牌必會

本文將介紹排序算法中的插入排序,包括:插入排序?qū)嵗?,代碼解析,效率分析。

1 插入排序?qū)嵗?/h2>

今天來學(xué)習(xí)插入排序,在講插入排序之前,我們先來講一講撲克牌。每個人都會打撲克牌,不知道你們有沒有注意到,我們在拿牌的時候,會習(xí)慣性地把手上的牌按照從小到大排好。這樣我們在出牌的時候才不會手忙腳亂。當(dāng)你的小伙伴正在發(fā)牌的時候,如果你習(xí)慣發(fā)一張拿一張,你可能會無意中用到插入排序來完成你的摸牌。

首先,拿到第一張牌,此時不用做任何操作。

拿到第二張牌之后,如果比原來的小,就放在左邊,如果比原來的大,就放在右邊。

拿到第三張牌之后,就找到右邊比這張牌大,左邊比這張牌小的地方插進去

拿到第四張,第五張……第n張,都是如此。

如果以上是你拿到牌之后的做法,那你已經(jīng)學(xué)會了插入排序,并且在無意中運用到了打牌之中。

插入排序的基本思想,就是每一步將一個待排序的元素,插入到前面已經(jīng)排好序的有序序列中,直到所有元素都插入完畢為止。

是不是跟上面摸牌的過程很像呢?來看一下插入排序的例子:

image

默認第一張牌是有序的,因此插入排序只需要排n-1趟。

第一趟,把5插入到有序序列[4]中,得到[4,5]。

第二趟,把1插入有序序列[4,5]中,得到[1,4,5]。

第三趟,把10插入有序序列[1,4,5]中,得到[1,4,5,10]。

最后一趟,把3插入有序序列[1,4,5,10]中,得到最終的[1,3,4,5,10]。

2 代碼解析

image

14行:插入排序需要n-1趟,從下標i=1開始遍歷

15-22行:變量j初始化為當(dāng)前待插入元素i,并設(shè)置變量temp存儲我們待插入的元素。從后往前找,如果前一個元素j-1比j大,讓前一個元素往后移,覆蓋j的值,并且j自身減1。直到j(luò)<=0(所有元素都比待插入元素大,此時插入到開頭位置),或者a[j]大于等于a[j-1] (j已經(jīng)到了它應(yīng)該插入的位置,再往前就不是有序數(shù)組了)。跳出wihle循環(huán)后,j已經(jīng)到達它要插入的位置,讓a[j]=temp;即可。

3 效率分析

注意到如果正確的插入位置在中間,需要把它右邊所有的元素后移一個位置,再把元素插入。最差情況下,如果是把一個降序序列排成升序,比如[10,9,8,7,6],則每次插入元素的位置都是在開頭,每次都需要移動整個有序數(shù)組。其時間復(fù)雜度為O(n^2)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,298評論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,348評論 0 2
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    zwb_jianshu閱讀 1,411評論 0 0
  • 排序的基本概念 在計算機程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關(guān)鍵字進行排序,排序完成的序列可用于快...
    Jack921閱讀 1,566評論 1 4
  • 這本書是我在懷孕時買的,一直放在書架上,沒有仔細的看,這次拿出來從頭仔細的閱讀了一遍,收獲頗多。 ...
    盡心閱讀 266評論 0 0

友情鏈接更多精彩內(nèi)容