C++排序系列(一) 插入排序之直接插入排序

來源:互聯網
上載者:User

鄭重聲明:本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!

       可以任意轉載、修改,轉載時是否標明出處,隨君而定!

演算法思想:

 

直接插入排序(straight insertion sort)的作法是:
每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程。
直接插入排序屬於穩定的排序,時間複雜性為o(n^2),空間複雜度為O(1)。
直接插入排序是由兩層嵌套迴圈組成的。外層迴圈標識並決定待比較的數值。內層迴圈為待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前一個數值進行比較,所以外層迴圈是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續迴圈比較,直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次迴圈。
值得注意的是,我們必需用一個儲存空間來儲存當前待比較的數值,因為當一趟比較完成時,我們要將待比較數值置入比它小的數值的後一位 插入排序類似玩牌時整理手中紙牌的過程。插入排序的基本方法是:每步將一個待排序的記錄按其關鍵字的大小插到前面已經排序的序列中的適當位置,直到全部記錄插入完畢為止。

 

初始序列:
i=1 [46] 58 15 45 90 18 10 62

i=2 [46 58] 15 45 90 18 10 62
┌——┘

i=3 [15 46 58] 45 90 18 10 62
┌——┘

i=4 [15 45 46 58] 90 18 10 62

i=5 [15 45 46 58 90] 18 10 62
┌—————┘

i=6 [15 18 45 46 58 90] 10 62
┌————————┘

i=7 [10 15 18 45 46 58 90] 62
┌—┘

i=8 [10 15 18 45 46 58 62 90]

實現代碼:

 1 template <typename T> 2 void sort(T v[], const int sz) 3 { 4     for (int i = 1; i < sz; i++)  5     { 6         T tmp = v[i]; 7         int j = i - 1; 8         while (j >= 0 && v[j] > tmp) 9         {10             v[j+1] = v[j];11             j--;12         }13         v[j+1] = tmp;14     }15 }

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.