下面咱們來說一下插入排序算法
基本思想以下:數組
將一個記錄插入到已排序好的有序表中,從而獲得一個新的有序表。實現要點,咱們須要設立一個哨兵,做爲臨時存儲和判斷數組邊界來用。直接插入的代碼以下:spa
1 for(i=1;i<n;i++) 2 { 3 //若是第i個元素大於第i-1元素,直接插入 4 //不然,移動有序表後再插入 5 if(a[i]<a[i-1]) 6 { 7 j=i-1; 8 x=a[i];//複製爲哨兵 9 a[i]=a[i-1];//前後移一個元素 10 while(x<a[j])//查找要插入的位置 11 { 12 a[j+1]=a[j];//元素後移 13 j--; 14 } 15 a[j+1]=x;//插入到正確位置 16 } 17 }
直接插入算法的時間複雜度爲O(n^2)。code
改進算法能夠用折半插入排序。由於插入排序要求對已經有序的表進行插入,咱們能夠用折半查找法來查找要插入的位置。代碼以下:blog
1 for(i=1;i<n;i++) 2 { 3 int temp=a[i]; 4 int low=0; 5 int high=i-1; 6 while(low<=high)//查找要插入的位置 7 { 8 int mid=(low+high)/2; 9 if(temp<a[mid])//在左(低)半區找 10 high=mid-1; 11 else//在右(高)半區找 12 low=mid+1; 13 } 14 for(j=i;j>=low;j--) 15 { 16 a[j]=a[j-1];//元素後移 17 } 18 a[low]=temp;//插入 19 }