插入排序(Insertion Sort)是一種簡單直觀的排序算法。它的工做原理是經過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,一般採用in-place排序(即只需用到O(1)的額外空間的排序),於是在從後向前掃描過程當中,須要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間。(摘自維基百科)算法
簡單點理解就是這樣:想象你拿着一副雜亂的撲克牌,而後你就會天然地將手中的牌換下位置,使其排好順序對不對?如下的圖片是借用《算法導論》的例子。ide
因此說插入排序就是分紅兩塊區域,一塊是已排好序的,另一塊是還沒排好序的;只要你不斷的從還沒排好序的那塊中取元素插入到已排好序的那塊上,那麼等到還沒排序好的那塊裏的元素沒了,就表明已經排好序了。函數
思路很簡單,下面給出個人代碼(排序函數的第二個for循環的前三句是爲了可以直觀地輸出排序過程):spa
1 /* 2 * 這是我本身寫的插入排序的寫法,跟書本上的思想同樣, 3 * 都是插入,不過實現的代碼有所不一樣。 4 */ 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<time.h> 8 #define M 10 9 10 void insertion_sort(int *p) 11 { 12 int i, j, tmp; 13 for(i = 1;i < M; i++) 14 for(j = 0; j < i; j++) 15 { 16 printf( "%2d ", *(p + j) ); /* 輸出 */ 17 if(j + 1 == i) /* 輸出 */ 18 printf( "\n" ); /* 輸出 */ 19 if(*(p + j) > *(p + i)) 20 { 21 tmp = *(p + j); 22 *(p + j) = *(p + i); 23 *(p + i) = tmp; 24 25 } 26 } 27 } 28 29 int main(void) 30 { 31 int i; 32 int a[M] = {0}; 33 34 //隨機生成10個兩位數 35 srand(time(0)); 36 for(i = 0; i < M; i++) 37 a[i] = rand() % 100; 38 39 printf( "未排序。。。\n" ); 40 for(i = 0; i < M; i++) 41 printf( "%2d ", a[i] ); 42 printf( "\n" ); 43 printf("\n排序中。。。\n"); 44 insertion_sort(a); 45 46 47 printf( "\n已排序。。。\n" ); 48 for(i = 0; i < M; i++) 49 printf( "%2d ", a[i] ); 50 51 printf( "\n" ); 52 53 return 0; 54 55 }
下面是運行的結果:3d
時間複雜度就是O(n^2)了,由於有兩個循環嘛。 code