數據結構59:插入排序算法


插入排序算法是所有排序方法中最簡單的一種算法,其主要的實現思想是將數據按照一定的順序一個一個的插入到有序的表中,最終得到的序列就是已經排序好的數據。

直接插入排序是插入排序算法中的一種,采用的方法是:在添加新的記錄時,使用順序查找的方式找到其要插入的位置,然后將新記錄插入。

很多初學者所說的插入排序,實際上指的就是直接插入排序算法,插入排序算法還包括折半插入排序、2-路插入排序,表插入排序和希爾排序等,后序文章都會一一講到。

例如采用直接插入排序算法將無序表 {3,1,7,5,2,4,9,6}進行升序排序的過程為:
  • 首先考慮記錄 3 ,由於插入排序剛開始,有序表中沒有任何記錄,所以 3 可以直接添加到有序表中,則有序表和無序表可以如圖 1 所示:

圖 1 直接插入排序(1)
  • 向有序表中插入記錄 1 時,同有序表中記錄 3 進行比較,1<3,所以插入到記錄 3 的左側,如圖 2 所示:

圖 2 直接插入排序(2)
  • 向有序表插入記錄 7 時,同有序表中記錄 3 進行比較,3<7,所以插入到記錄 3 的右側,如圖 3 所示:

圖 3 直接插入排序(3)
  • 向有序表中插入記錄 5 時,同有序表中記錄 7 進行比較,5<7,同時 5>3,所以插入到 3 和 7 中間,如圖 4 所示:

圖 4 直接插入排序(4)
  • 向有序表插入記錄 2 時,同有序表中記錄 7進行比較,2<7,再同 5,3,1分別進行比較,最終確定 2 位於 1 和 3 中間,如圖 5 所示:

圖 5 直接插入排序(5)
  • 照此規律,依次將無序表中的記錄 4,9 和 6插入到有序表中,如圖 6 所示:

圖 6 依次插入記錄4,9和6

直接插入排序的具體代碼實現為:
#include <stdio.h>
//自定義的輸出函數 void print(int a[], int n ,int i)
{ printf(
"%d:",i); for(int j=0; j<8; j++)
   { printf(
"%d", a[j]); } printf("\n"); }
//直接插入排序函數 void InsertSort(int a[], int n) { for(int i= 1; i<n; i++)
   {
if(a[i] < a[i-1])
     {
       // 若第 i 個元素大於 i-1 元素則直接插入;反之,需要找到適當的插入位置后在插入。 int j= i-1; int x = a[i]; while(j>-1 && x < a[j])
       {
         // 采用順序查找方式找到插入的位置,在查找的同時,將數組中的元素進行后移操作,給插入元素騰出空間 a[j+1] = a[j]; j--; } a[j+1] = x; // 插入到正確位置 } print(a, n, i);  // 打印每次排序后的結果 } } int main()
{
int a[8] = {3,1,7,5,2,4,9,6}; InsertSort(a, 8);
return 0; }
運行結果為:
1:13752496 2:13752496 3:13572496 4:12357496 5:12345796 6:12345796 7:12345679
直接插入排序算法本身比較簡潔,容易實現,該算法的時間復雜度為 O(n2)

插入排序的其它 4 種排序方法,在后序章節中有詳細介紹。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com