1. 程式人生 > >插入排序演算法及C語言實現

插入排序演算法及C語言實現

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

直接插入排序是插入排序演算法中的一種,採用的方法是:在新增新的記錄時,使用順序查詢的方式找到其要插入的位置,然後將新記錄插入。

很多初學者所說的插入排序,實際上指的就是直接插入排序演算法,插入排序演算法還包括折半插入排序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 種排序方法,在後序章節中有詳細介紹。