基本思想:每次將乙個待排序的記錄,按其關鍵字大小插入到前邊已經排好序的子陣列中的適當位置,知道全部記錄插入完成為止。
分類:直接插入排序和希爾(shell)排序。
一、直接插入排序:
基本操作:將當前無序區的第乙個記錄r[i]插入到有序區r[1....i-1]中適當的位置,使得r[1...i]變為新的有序區。每次使有序區增加1個記錄,也稱為增量法。
可分解為以下步驟:
(1)在當前有序區r[1...i-1]中查詢r[i]的正確插入位置k;
(2)將r[1...i-1]中的記錄均後移以為i,騰出k位置上的空間插入r[i]。
對以上的方法進行改進,使得查詢比較和記錄移動操作交替進行。將待插入的記錄r[i]的關鍵字從右向左依次與有序區中記錄r[j](j=i-1,...,1』)的關鍵字進行比較。
採用公升序排序:(1)如果r[j]的關鍵字大於r[i]的關鍵字,則將r[j]後移一位;
(2)如果r[j]的關鍵字小於或等於r[i]的關鍵字,則查詢過程結束,(j+1)即為r[i]的插入位置。
這樣便可完成一次直接插入排序。
使用改進方法的程式如下:
void insert_sort(int a,int len)
}
二、希爾排序(shell)
基本思路:在直接插入排序中,每次只插入乙個數,使有序序列只增加1個節點,並且對插入的下乙個數沒有提供任何幫助。希爾排序先將要排序的一組數按照某個增量d分成若干組,對每個組中的元素進行排序,然後用乙個較小的增量對它進行再次分組,並對新組進行再排序。當增量減到1時,整個要排序的數被分成乙個組,排序完成。所以,希爾排序其實質上也是一種分組插入的方法。
**如下:
void shell_sort(int a,int len)
{ int temp;
for(int h=len/2;h>0;h/=2)//控制增量
{ for(int i=h;i=0&&a[j]
希爾排序的時間效能優於直接插入排序,其原因如下:
1、當陣列初始狀態基本有序時,直接插入排序所需的比較和移動次數均較少。
2、當n值較小時,n和n2的差別也較小,即直接插入排序的最優時間複雜度o(n)和最壞時間複雜度o(n2)差別也不大。
3、在希爾排序開始時增量較大,分組較多,每組的記錄數目少,在各組內直接插入較快,隨著增量d減小,分組數逐漸減小,而各組的記錄數目逐漸增多,但此時陣列已較接近有序狀態,所以最後一次排序也較快。
排序之插入排序
本人是純正的蒟蒻。寫這些部落格目的是為了複習一些基礎知識,同時也幫助一下比我還要弱的蒟蒻 估計沒有 排序 排序有很多種,這裡先介紹幾種最基本,最簡單的。一.插入排序 主要思想 假設前面n個元素已經有序排列,現在要插入乙個元素,使這n 1個元素有序,先在原有序列中找到應該插入的位置,然後把這個位置的數...
排序之插入排序
插入演算法 迴圈陣列,以指標資料為基值 並且記錄,通過和左側 右側 的迴圈比較,當比較值大於 小於 基值時 將大的值至後,指標繼續移動,比較,置換。直到遇到小於基值,或者到陣列邊界時截止,並且置換至首位。結束一次內迴圈,這是外迴圈的指標左側的是有序。class sort public static ...
7 插入排序之折半插入排序
7 折半插入排序 折半插入 考慮到插入第i個元素前面的i 1個元素是有序的,計算0 i 1的中間點,和i個元素進行比較,這樣完成了折半。然後不停地用上面的步驟,快速的找出第i個元素的位置。時間複雜度 折半插入排序比直接插入排序明顯減少了關鍵字之間的比較次數,但是移動次數是沒有改變。所以,折半插入排序...