《大話資料結構》第9章 排序 9.5 直接插入排序_大話資料結構

來源:互聯網
上載者:User
9.5.1 直接插入排序演算法

        撲克牌是我們幾乎每個人都可能從事過的遊戲。而最基本的撲克玩法都是一邊摸牌,一邊理牌。假如我們拿到了這樣一手牌,如圖9-5-1。啊,似乎是同花順呀,別急,我們得理一理順序才知道是否是真的同花順。請問,如果是你,應該如何理牌呢。

 


          應該說,哪怕你是第一次玩撲克牌,只要認識這些數字,理牌的方法都是不用教的。將3和4移動到5的左側,再將2移動到最左側,順序就算是理好了。這裡,我們的理牌方法,就是直接插入排序法。
        直接插入排序(Straight Insertion Sort)的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。
        顧名思義,從名稱上也可以知道它是一種插入排序的方法。我們來看直接插入排序法的代碼。(註:要瞭解演算法的原理,直接看代碼和後面的解釋並不是最好的辦法。將代碼輸入到電腦中,運行並斷點逐行跟蹤,參照本文的講解和圖示,觀察變數的變化情況,才會收到比較好的效果。這裡的代碼全是用C語言編寫,不過對於擅長C#的讀者應該不存在閱讀難度。)

void InsertSort(SqList *L){   int i,j;  for(i=2;i<=L->length;i++)  {   if (L->r[i]<L->r[i-1])   /* 需將L->r[i]插入有序子表 */   {    L->r[0]=L->r[i];    /* 設定哨兵 */    for(j=i-1;L->r[j]>L->r[0];j--)     L->r[j+1]=L->r[j];  /* 記錄後移 */    L->r[j+1]=L->r[0];   /* 插入到正確位置 */   }  }}

1) 程式開始運行,此時我們傳入的SqList參數的值為length=6,r[6]={0,5,3,4,6,2},其中r[0]=0將用於後面起到哨兵的作用。
2) 第4~13行就是排序的主迴圈。i從2開始的意思是我們我們假設r[1]=5已經放好位置,後面的牌其實就是插入到它的左側還是右側的問題。
3) 第6行,此時i=2,L.r[i]=3比L.r[i-1]=5要小,因此執行第8~11行的操作。第8行,我們將L.r[0]賦值為L.r[i]=3的目的是為了起到第9~10行的迴圈終止的判斷依據。如圖9-5-2。圖中下方的虛線箭頭,就是第10行,L.r[j-1]=L.r[j]的過程,將5右移一位。

4) 此時,第10行就是在移動完成後,空出了空位,然後第11 行L.r[j+1]=L.r[0],將哨兵的3賦值給j=0時的L.r[j+1],也就是說,將撲克牌3放放置到L.r[1]的位置。如圖9-5-3。

5) 繼續迴圈,第6行,因為此時i=3,L.r[i]=4比L.r[i-1]=5要小,因此執行第8~11行的操作。將5再右移一位,將4放置到當前5所在位置。如圖9-5-4。

6) 再次迴圈,此時i=4。因為L.r[i]=6比L.r[i-1]=5要大,於是第8~11行代碼不執行,此時前三張牌的位置沒有變化。如圖9-5-5。
 

7) 再次迴圈,此時i=5,因為L.r[i]=2比L.r[i-1]=6要小,因此執行第8~11行的操作。由於6、5、4、3都比2小,它們都將右移一位,將2放置到當前3所在位置。如圖9-5-6。此時我們的排序也就完成了。


9.5.2 直接插入排序複雜度分析

        我們來分析一下這個演算法,從空間上來看,它只需要一個記錄的輔助空間。因此關鍵是看它的時間複雜度。
        當最好的情況,也就是要排序的表本身就是有序的,比如紙牌拿到後就是{2,3,4,5,6},那麼我們比較次數,其實就是代碼第6行每個L.r[i]與L.r[i-1的比較,共比較了 次,由於每次都是L.r[i]>L.r[i-1],因此沒有移動的記錄,時間複雜度為O(n)。
        當最壞的情況,即待排序表是逆序的情況比如{6,5,4,3,2},此時需要比較 次,而記錄的移次數也達到最大值 次。
        如果排序記錄是隨機的,那麼根據機率相同的原則,平均比較和移動次約為n2/4 次。因此,我們得出直接插入排序法的時間複雜度為O(n2)。從這裡也看出,同樣的O(n2)時間複雜度,直接插入排序法比冒泡和簡單選擇排序的效能要好一些。

出處:http://www.cnblogs.com/cj723/archive/2011/04/19/2020501.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.