插入排序——C語言


插入排序

插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從后向前掃描,找到相應位置並插入。

 (每步將一個待排序的元素,按其排序碼大小插入到前面已經排好序的一組元素的適當位置上去,直到元素全部插入為止)

 

(圖片來源:https://www.cnblogs.com/fivestudy/p/10212306.html)

具體算法描述如下:

1、將待排序序列第一個元素看做一個有序序列,把第二個元素到最后一個元素當成是未排序序列;

2、取出下一個元素,在已經排序的元素序列中從后向前掃描;

3、如果該元素(已排序)大於新元素,將該元素移到下一位置;

4、重復步驟3,直到找到已排序的元素小於或者等於新元素的位置;

5、將新元素插入到該位置后;

6、重復步驟2~5。

 

排序過程示例如下圖:

(圖片來源:https://www.cnblogs.com/chengxiao/p/6103002.html)

代碼實現:

 1     /* 插入排序*/
 2     int num[5] = {3, 7, 1, 8, 5};  3     int pos, cur;  4     int i;  5     int length = sizeof(num)/sizeof(num[0]);  6 
 7     for (i = 1; i < length; i++)  8  {  9         pos = i -1 ;    //有序序列的最后一個元素位置
10         cur = num[i];    //保存待排序元素的值
11         while ( pos >= 0 && num[pos] > cur) 12  { 13             num[pos + 1] = num[pos]; 14             pos--; 15  } 16         num[pos + 1] = cur;    //將待排序元素插入數組中
17     }

 也可以寫成兩個for循環的形式,效果相同

 1     /* 插入排序*/
 2     int num[5] = {3, 7, 1, 8, 5};  3     int cur;  4     int i, j;  5     int length = sizeof(num)/sizeof(num[0]);  6 
 7     for (i = 1; i < length; i++)  8  {  9         cur = num[i];    //待排序元素
10         for (j = i - 1; j >= 0 && num[j] > cur; j--) 11  { 12             num[j + 1] = num[j]; 13  } 14         num[j + 1] = cur; 15     }

排序過程:以上面的例子來說排序的對象是 3,7,1,8,5 數組長度為5,因為第一個元素可以認為已經被排序,所以for循環的次數是:5(數組長度) - 1 = 4

第一次for循環:

3>7不成立,插入待排序元素,數組不變,此時有序序列為3,7

 

第二次for循環:

7>1成立,數組變成3,7,7,8,5

3>1成立,數組變成3,3,7,8,5

插入待排序元素,此時數組為1,3,7,8,5,有序序列為1,3,7

 

第三次for循環:

7>8不成立,插入待排序元素,數組不變,此時有序序列為1,3,7,8

 

第四次for循環:

8>5成立,數組變成1,3,7,8,8

7>5成立,數組變成1,3,7,7,8

3>5不成立,插入待排序元素,此時數組為1,3,5,7,8,有序序列為1,3,5,7,8,排序完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM