經(jīng)典排序算法系列2----插入排序的實(shí)現(xiàn)

直接插入排序(Insertion Sort)的基本思想是:每次將一個(gè)待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列中的適當(dāng)位置,直到全部記錄插入完成為止。

設(shè)數(shù)組為a[0…n-1]。

  1.  初始時(shí),a[0]自成1個(gè)有序區(qū),無序區(qū)為a[1..n-1]。令i=1
    
  2.  將a[i]并入當(dāng)前的有序區(qū)a[0…i-1]中形成a[0…i]的有序區(qū)間。
    
  3.  i++并重復(fù)第二步直到i==n-1。排序完成。
    

下面給出嚴(yán)格按照定義書寫的代碼(由小到大排序):

void Insertsort1(int a[], int n)  
{  
    int i, j, k;  
    for (i = 1; i < n; i++)  
    {  
        //為a[i]在前面的a[0...i-1]有序區(qū)間中找一個(gè)合適的位置  
        for (j = i - 1; j >= 0; j--)  
            if (a[j] < a[i])  
                break;  
  
        //如找到了一個(gè)合適的位置  
        if (j != i - 1)  
        {  
            //將比a[i]大的數(shù)據(jù)向后移  
            int temp = a[i];  
            for (k = i - 1; k > j; k--)  
                a[k + 1] = a[k];  
            //將a[i]放到正確位置上  
            a[k + 1] = temp;  
        }  
    }  
}  

這樣的代碼太長了,不夠清晰。現(xiàn)在進(jìn)行一下改寫,將搜索和數(shù)據(jù)后移這二個(gè)步驟合并。即每次a[i]先和前面一個(gè)數(shù)據(jù)a[i-1]比較,如果a[i] > a[i-1]說明a[0…i]也是有序的,無須調(diào)整。否則就令j=i-1,temp=a[i]。然后一邊將數(shù)據(jù)a[j]向后移動(dòng)一邊向前搜索,當(dāng)有數(shù)據(jù)a[j]小于a[i]時(shí)停止并將temp放到a[j + 1]處。

void Insertsort2(int a[], int n)  
{  
    int i, j;  
    for (i = 1; i < n; i++)  
        if (a[i] < a[i - 1])  
        {  
            int temp = a[i];  
            for (j = i - 1; j >= 0 && a[j] > temp; j--)  
                a[j + 1] = a[j];  
            a[j + 1] = temp;  
        }  
}  

再對(duì)將a[j]插入到前面a[0…j-1]的有序區(qū)間所用的方法進(jìn)行改寫,用數(shù)據(jù)交換代替數(shù)據(jù)后移。如果a[j]前一個(gè)數(shù)據(jù)a[j-1] > a[j],就交換a[j]和a[j-1],再j--直到a[j-1] <= a[j]。這樣也可以實(shí)現(xiàn)將一個(gè)新數(shù)據(jù)新并入到有序區(qū)間。

void Insertsort3(int a[], int n)  
{  
    int i, j;  
    for (i = 1; i < n; i++)  
        for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--)  
            Swap(a[j], a[j + 1]);  
}  

推薦閱讀:
經(jīng)典排序算法系列1----冒泡排序的實(shí)現(xiàn)
經(jīng)典排序算法系列2----插入排序的實(shí)現(xiàn)
經(jīng)典排序算法系列3----直接選擇排序及交換二個(gè)數(shù)據(jù)的正確實(shí)現(xiàn)
經(jīng)典排序算法系列4----希爾排序的實(shí)現(xiàn)
經(jīng)典排序算法系列5----歸并排序
經(jīng)典排序算法系列6----快速排序
經(jīng)典排序算法系列7----堆與堆排序
經(jīng)典排序算法系列8----7大排序算法總結(jié)篇
經(jīng)典排序算法系列9----分配排序(桶排序和基數(shù)排序)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容