演算法之直接插入排序和希爾排序

2022-05-20 17:59:21 字數 1838 閱讀 4100

基本思想:

將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

直接插入排序示例:

如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。

演算法的實現:

void print(int a, int n ,int i)

cout<

}  void insertsort(int a, int n)  

a[j+1] = x;                 //插入到正確位置  

}  print(a,n,i);                   //列印每趟排序的結果  

}  }  

int main()

insertsort(a,10);  

print(a,10,10);  

}效率:

時間複雜度:o(n^2).

其他的插入排序有二分插入排序,2-路插入排序。

希爾排序是1959 年由d.l.shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序

基本思想:

先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。

操作方法:

選擇乙個增量序列t1,t2,…,tk,其中ti>tj,tk=1;

按增量序列個數k,對序列進行k 趟排序;

每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。

希爾排序的示例:

演算法實現:

即:先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子串行,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。

void print(int a, int n ,int i)

cout<

}  /*直接插入排序的一般形式 ,int dk 縮小增量,如果是直接插入排序,dk=1 */  

void shellinsertsort(int a, int n, int dk)  

a[j+dk] = x;            //插入到正確位置  

}  print(a, n,i );  

}    

}  /*先按增量d(n/2,n為要排序數的個數進行希爾排序*/  

void shellsort(int a, int n)

}  int main()

shellsort(a,10);           //希爾插入排序  

print(a,10,10);  

}  希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定情況下可以準確估算出關鍵碼的比較次數和記錄的移動次數。目前還沒有人給出選取最好的增量因子序列的方法。增量因子序列可以有各種取法,有取奇數的,也有取質數的,但需要注意:增量因子中除1 外沒有公因子,且最後乙個增量因子必須為1。希爾排序方法是乙個不穩定的排序方法。

插入排序演算法之直接插入排序和希爾排序

有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法 插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。直接插入排序的排序思路是 每次將乙個待排序的元素與已排...

插入排序演算法之直接插入排序和希爾排序

有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法 插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。直接插入排序的排序思路是 每次將乙個待排序的元素與已排...

排序演算法之插入排序(直接插入 希爾排序)

乙個好的排序演算法對於程式的優化會有很大的提公升,雖然在許多語言的類庫中就存在了n種排序方法,但是只有在了解了每一種排序演算法後才能更好的在實際中運用這些演算法。這裡我主要說明插入排序中的直接插入以及希爾排序的實現。直接插入排序是最簡單的排序演算法之一。對於直接插入排序,它始終維護著乙個有序序列,在...