2路插入排序實現

2021-09-30 13:27:24 字數 710 閱讀 2842

1,2路插入排序的思想:

在折半插入排序的基礎上改進,目的是減少排序過程中激動記錄的次數,既然是在折半的基礎上,那麼應該也能減少查詢操作。

具體做法:

另設乙個和原陣列l同型別的陣列d,將l[1]賦值給d[0],並將d[0]看成是在排好序的序列中處於中間的位置,即當l中來乙個數和d[0]比較,大往d[0]後放,小往前放,這時候把d看成是個迴圈向量。因為在以d[0]分隔的兩邊都是有序序列,我們可以通過折半查詢,找到l[i]要插入的位置,然後移動。但是要折半查詢得先找到比d[0]小的那一邊的第乙個數以及比d[0]大的那一邊最後乙個數,所以因此first和final兩個向量,分別表示排序過程中得到的有序序列中第乙個記錄和最後乙個記錄的位置。

下邊是具體**:

插入排序適應小規模排序,測試了十萬個隨機數,時間為:4771毫秒!

2路插入排序的時間代價仍是o(n2),空間代價為o(n);實際移動記錄的次數約為n

2/ 8;但是當第乙個記錄是關鍵字中最小或最大的記錄時,2路插入排序就完全失去了優越性。

2,在網上看到乙個版本,操作大概如下:

(1),先和final值比較,若大則直接在final++上插入

(2),再和first值比較,若小則直接在first--(可能要取模)上插入

(3),若都不滿足,則表示在first和final中間,通過從final開始一步步往first找插入位置

沒有用折半操作,我覺得應該要有折半查詢的操作。

2路插入排序

基本思想 以第乙個記錄為界,將整個記錄序列分成兩部分進行處理。將不小於第乙個記錄的所有記錄用折半插入的方式插入左路的序列序列中,將小於第乙個序列的記錄插入用折半插入的方法插入到右路的序列中。final為左路最後乙個元素,first為右路第乙個元素。空間複雜度o n 時間複雜度o n 2 這是穩定的排...

排序演算法 2 路插入排序

include include define status int define max 20 typedef struct elemtype typedef struct sqlist void inital sqlist l 初始化 bool lt int i,int j void towrod...

直接插入排序 改進演算法 2路插入排序

具體做法 另設乙個和l.r同型別的陣列d,首先將l.r 1 賦值給d 1 並將的d 1 看成是在排好序的序列中處於中間位置的記錄,然後從l.r中第2個記錄起依次插入到d 1 之前或之後的有序序列中。include include define maxsize 20 typedef int keyty...