內部排序——直接插入排序


最近做一個排序中間件,所以需要研究排序算法,而且重點是要實現出來。

實現算法語言為C語言,使用環境為VS2010集成環境。

待排記錄數據類型:

//數據
#define MAXSIZE 20
typedef int KeyType;
typedef int InfoType;
typedef struct{
    KeyType key;            //關鍵字項
    InfoType otherinfo;        //其他數據項
}RedType;                    //記錄類型
typedef struct{
    RedType r[MAXSIZE+1];    //r[0]閑置或用作哨兵單元
    int length;                //順序表長度
}SqList;                    //順序表類型

 

 

最簡單的插入排序

直接插入排序:將一個記錄插入到已經排好序的有序表中,從而得到一個新的,記錄數字增1的有序表

直接插入排序理論比較簡單,算法也比較簡單。

//插入排序
void InsertSort(SqList &L){
    //對順序表L作直接插入排序
    for(int i=2;i<=L.length;i++){
        if(LT(L.r[i].key,L.r[i-1].key)){
            L.r[0]=L.r[i];
            L.r[i]=L.r[i-1];
        }
        int j=i-2;
        for(;LT(L.r[0].key,L.r[j].key);j--){
            L.r[j+1]=L.r[j];
        }
        L.r[j+1]=L.r[0];
    }
}

函數LT(int,int)是比較的內容。根據數據類型比較,這里有一個整型大小比較的例子。

bool LT(int x,int y){
    if(x<y)
        return true;
    else
        return false;
}

測試

為了便已測試,下面給一個完整的測試代碼

插入排序算法實例
// TestInserSort.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include "stdio.h"

//數據
#define MAXSIZE 20
typedef int KeyType;
typedef int InfoType;
typedef struct{
    KeyType key;            //關鍵字項
    InfoType otherinfo;        //其他數據項
}RedType;                    //記錄類型
typedef struct{
    RedType r[MAXSIZE+1];    //r[0]閑置或用作哨兵單元
    int length;                //順序表長度
}SqList;                    //順序表類型


bool LT(int x,int y){
    if(x<y)
        return true;
    else
        return false;
}
//插入排序
void InsertSort(SqList &L){
    //對順序表L作直接插入排序
    for(int i=2;i<=L.length;i++){
        if(LT(L.r[i].key,L.r[i-1].key)){
            L.r[0]=L.r[i];
            L.r[i]=L.r[i-1];
        }
        int j=i-2;
        for(;LT(L.r[0].key,L.r[j].key);j--){
            L.r[j+1]=L.r[j];
        }
        L.r[j+1]=L.r[0];
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    SqList L;
    scanf("%d",&L.length);
    for(int i=1;i<=L.length;i++){
        scanf("%d",&L.r[i].key);
    }
    InsertSort(L);
    for(int i=1;i<=L.length;i++){
        printf("%d\t",L.r[i].key);
    }
    return 0;
}

關於插入排序的效率

空間:S(1),直接插入排序只需要一個輔助空間。

時間:排序的基本炒作為,1.比較關鍵字的大小;2.移動記錄

最好情況:當記錄已經是有序而且序列就是所求順序的時候,第二個for循環將不會被運行,整體空間復雜度為O(n)

最壞情況:當記錄和需要得出的序列剛好相反時,第二個for循環被執行的次數最多,比較次數為(2,3,...,n)次,即(n+2)(n-1)/2,移動次數為(2,3,...,n,n+1),即(n+4)(n-1)/2。

平均次數大約為n2/4,即時間復雜度為O(n2)

 

 

參考資料
[1] 嚴蔚敏 吳偉民 《數據結構(C語言版)》 北京:清華大學出版社,1997.4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM