插入排序
插入排序(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,排序完成