資料結構 折半插入排序

2021-07-31 08:53:10 字數 1067 閱讀 3834

①每次插入,都從前面的有序子表中查詢出待插入元素應該被插入的位置;

②給插入位置騰出空間,將待插入元素複製到表中的插入位置。

注意到該演算法中,總是邊比較邊移動元素,下面將比較和移動操作分離開來,即先折半查詢出元素的待插入位置,然後再同意地移動待插入位置之後的所有元素。當排序表為順序儲存的線性表時,可以對直接插入排序演算法作如下改進:由於是順序儲存的線性表,所以查詢有序子表時可以用折半查詢來實現。在確定出待插入位置後,就可以同意地向後移動元素了。

void insertsort(elemtype a,int n)

for(j=i-1;j>=high+1;--j)

a[j+1]=a[j];//統一向後移動元素,空出插入位置

a[high+1]=a[0];//插入操作}}

第一趟:按上述**的流程分析,從a[2]開始計算,{11}是乙個已排序子表,按關鍵字13進行折半查詢它的位置,**的上半部分查詢該元素元素應該插入的位置為a[2],所以下半部分並不需要移動元素,已排序子表為{11,13}

第二趟:從a[3]開始計算,low=1,high=2,mid=1,因為7<11,所以high=2-1=1;第二次迴圈mid=1,7<11,high=0,迴圈不滿足條件,此時開始移動元素;要移動的元素範圍為a[1]到a[2],a[1]=7。

第三趟第四趟依此類推…..(只要記住一點,先折半查詢元素的應該插入的位置,然後統一移動應該移動的元素,再將這個元素插入到正確的位置)

時間複雜度:不難看出,折半插入排序僅僅是減少了比較元素的次數,約為o(nlogn),而且該比較次數與待排序表的初始狀態無關,僅取決於表中的元素個數n;而元素的移動次數沒有改變,它依賴於待排序表的初始狀態。因此,折半插入排序的時間複雜度仍然為o(n²),但它的效果還是比直接插入排序要好。

空間複雜度:很顯然,排序只需要乙個位置來暫存元素,因此空間複雜度為o(1)。

資料結構 折半插入排序

從關於查詢的討論中可知,對有序表進行折半查詢,其效能優於順序查詢。所以可以將折半查詢思想用於在有序記錄r 1,i 1 中確定應插入的位置,相應的排序法稱為折半插入排序法。折半插入排序是對直接插入排序演算法的改進,在插入某記錄時,採用折半查詢的方法確定插入的位置。include define maxs...

資料結構之插入排序 折半插入排序

排序思路 通過折半查詢的方式找到合適的插入位置再插入。演算法實現 public class biinsertsort else 插入點在 mid 1,right left mid 1 直到找到合適的位置 left或right 1 接下來就將left right 1後的元素後移 for int j i...

資料結構 插入排序(直接插入排序 折半插入排序)

二 插入排序 1.直接插入排序 這裡我們注意,元素的選擇是從第二個元素開始!動態過程如下 遞增的 實現 include using namespace std void insertsort int a,int len 若小於前乙個元素,則繼續向前走,前乙個元素後移 演算法分析 優點 簡單,穩定。總...