插入排序主要思想是:把要排序的數字插入到已經排好的數據中。(我自己理
解的哈)。例如12356是已經排好的序,我們將4插入到他們中,時插入之後也是排好序的。這裏顯而易見
是插入到3的後面。變爲123456.
實現思路:插入排序就是先是一個有序的數據,然後把要插入的數據插到指定的位置,而排序首先給的就
是無序的,我們怎麼確定先得到一個有序的數據呢?答案就是:如果只有一個,當然是有序的咯。我們先
拿一個出來,他是有序的,然後把數據一個一個插入到其中,那麼插入之後是有序的,所以直到最後都是
有序的。。哈哈。結果就出來了!
當然在寫的時候還是有一個技巧的,不需要開額外的數組,下標從第二個元素開始遍歷知道最後一個,然
後插入到前面已經有序的數據中。這樣就不會浪費空間了。插入排序用處還是很多的,特別是鏈表中,因
爲鏈表是指針存放的,沒有數組那麼好準確的用下標表示,插入是簡單有效的方法。嘻嘻。。廢話少說,
源代碼奉上:
例 11.1. 插入排序
#include <stdio.h> #define LEN 5 int a[LEN] = { 10, 5, 2, 4, 7 }; void insertion_sort(void) { int i, j, key; for (j = 1; j < LEN; j++) { printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]); key = a[j]; i = j - 1; while (i >= 0 && a[i] > key) { a[i+1] = a[i]; i--; } a[i+1] = key; } printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]); } int main(void) { insertion_sort(); return 0; }
爲了更清楚地觀察排序過程,我們在每次循環開頭插了打印語句,在排序結束後也插了打印語句。程序運行結果是:
10, 5, 2, 4, 7 5, 10, 2, 4, 7 2, 5, 10, 4, 7 2, 4, 5, 10, 7 2, 4, 5, 7, 10