1.插入排序
插入排序的原理很簡單,就是將待排序的元素和已排序好的元素進行比較,找到合適的位置進行插入。
例子:2 1 5 3 6 4(升序排序)
1)將第一個元素看成已排序好的序列,從第二個元素開始比較,先用一個臨時變量 temp 存放第二個元素的值。開始比較,1 比 2 小,所以把2賦值給1的位置,繼續向前比較
這時前面已經沒有元素了,比較結束,將temp的值賦值給2的位置
序列變成:1 2 5 3 6 4
2)繼續按1)的方法對元素5進行同樣的操作,5不小於2,此時不用繼續比較了,因爲序列是有序的 5 不小於2 那就不可能小於1 .
序列變成:1 2 5 3 6 4
3)3 比 5 小,將5的賦值給3的位置,繼續向前比較,3不小於2,比較結束,將temp的值賦值給5的位置
序列變成: 1 2 3 5 6 4
4)6 不小於 5 不用比較
序列:1 2 3 5 6 4
5)4 比6小,將6賦值給4的位置,繼續向前比較,4 比 5小 將5的值賦值給6的位置,繼續向前比較4不小於3,比較結束,將temp值賦值給5的位置
序列:1 2 3 4 5 6
2.代碼
代碼看上去有點難理解,但是隻要自己在腦子裏按步驟過一遍就懂了。
1 #include<stdio.h> 2 void insertSort(int *arr,int num) 3 { 4 int i,j; 5 int temp; 6 //從第二個元素開始比較 7 for(i=1;i<num;i++) 8 { 9 temp=arr[i];//保存要插入元素的值 10 j=i-1; 11 while(j>=0&&arr[j]>temp) 12 { 13 arr[j+1]=arr[j]; 14 j--; 15 } 16 arr[j+1]=temp;//找到合適位置 17 } 18 } 19 int main() 20 { 21 int i; 22 int arr[10]={1,3,-9,0,10,2,8,9,19,-1}; 23 insertSort(arr,10);//插入排序 24 for(i=0;i<10;i++) 25 printf("%d\n",arr[i]); 26 return 0; 27 }
時間複雜度O(n^2)
插入排序可以改進,變成另一種排序算法-----希爾排序
希爾排序的時間複雜度O(n^1.3到n^2之間)
希爾排序,下次再說。