詳解折半插入排序演算法

2021-07-13 20:10:43 字數 2133 閱讀 4708

折半插入排序演算法的時間複雜度:o(nlogn)

折半插入排序利用二分法的思想,在乙個有序的序列中,找到新元素在該序列中的位置,然後插入。如圖1所示,共有n個元素,前i個元素已經是有序序列,現在要將第i個元素插入其中。折半插入排序需要做兩步工作:找到待插入元素的位置、插入。

圖1 插入排序示意圖

首先要定義兩個指標(不是語法裡面的指標,是下標的意思)low和high用於尋找a[i]的插入位置,low指向a[0],high指向a[i-1],中點mid=(low+high)/2,

圖2 「折半」示意圖

如圖2所示二分法的思想是,比較a[i]與a[mid]的大小,若a[i]>a[mid],說明a[i]的位置應該在mid~high之間,將區間[low,high]縮短為[mid+1,high],令指標low=mid+1;若a[i]<=a[mid],說明a[i]的位置應該在low~mid之間,將區間壓縮為[low,mid-1],令指標high=mid-1。每次折半之後,a[i]的位置應該在[low,high]之間。

如此迴圈,low與high漸漸靠近,直到low>high跳出迴圈,a[i]的位置找到,low即為a[i]應該放置的位置。

找到a[i]的位置之後進行插入,先將a[low]~a[i-1]這些元素向後平移乙個元素的位置,然後將a[i]放到low位置。

用dev-c++編寫的c++**:

#include using namespace std;

void binsort(int *a,int n) //對int陣列進行從小到大的排序

}int main() //舉例說明

; binsort(a,n);

for(int i=0;i

乙個細節:為什麼內層的迴圈while(low<=high)結束之後以low作為a[i]應該放置的位置?

觀察指標low與high重合之前與之後二者位置變化情況。設low>high的一步為第n步,走到第n步一共有四種情形:

情形一:

第n-2步時,mid=(low+high)/2,如果a[i]>a[mid],low=mid+1,這樣就到了第n-1步,low與high重合,mid=(low+high)/2=low=high,由於a[i]<=a[high]=a[mid]必然成立(否則,a[i]>a[mid]=a[high],那麼a[i]放置的位置應該在high之後了,也不會到達這一步),所以high=mid-1,這樣就到了第n步,high

情形二:

第n-2步,mid=(low+high)/2,如果a[i]<=a[mid],high=mid-1,這樣就到了第n-1步,low與high重合,mid=(low+high)/2=low=high,由於a[i]>a[low]=a[mid],所以low=mid+1,這樣就到了第n步,high

情形三:

第n-2步,mid=(low+high)/2=low,如果a[i]>a[mid]=a[low],low=mid+1,這樣就到了第n-1步,low與high重合,mid=low=high,由於a[i]<=a[high]=a[mid],所以,high=mid-1,這樣就到了第三步,high

情形四:

第n-1步,mid=(low+high)/2 = low,如果a[i]<=a[mid]=a[low],high=mid-1=low-1,這樣就到了第n步,low>high,退出迴圈,此時a[high]這樣就解釋了為什麼退出迴圈之後,將low作為尋找的位置。

如有錯誤請指正!

折半插入排序演算法

折半插入排序演算法是直接插入排序演算法的改進 插入元素的位置通過折半查詢確定。折半插入排序演算法的時間複雜程度為o n 2 空間負責程度是o 1 具體演算法如下 資料結構如下 typedef struct elemtype recordtype 陣列array 0 的位置無效,充當輔助儲存空間 vo...

折半插入排序演算法

這個演算法中最難以理解的莫過於,對於查詢演算法的理解了。因為在這種查詢演算法中,相等的情況並沒有單獨的列舉出來跳出迴圈,演算法設計者這樣設計的目的是什麼呢?原來演算法設計者的目的是找到為了找到小於等於查詢值的最大最大值,或者大於等於查詢值得最小值,以便方便的進行插入。如在本個例子中l mid l 0...

排序演算法 折半插入排序

include include define status int define max 20 typedef struct elemtype typedef struct sqlist 結構體的定義 void inital sqlist l 初始化陣列 bool lt int i,int j 比較...