C語言 折半插入排序與二分查詢

2021-07-08 17:08:25 字數 2592 閱讀 9878

標籤:c語言 插入排序 二分法

by 小威威

這部分內容我也是自學的,在網上找資料的時候覺得別人寫的文章很難理解,花了我不少時間。所以我寫了這一篇博文,希望能幫助你們更好理解二分插入排序的思想。畢竟這篇文章是入門級的~

折半插入排序(binary insertion sort)是對插入排序演算法的一種改進,所謂排序演算法過程,就是不斷的依次將元素插入前面已排好序的序列中。

換句話說,就是假設陣列長度為8,那麼我就插7次資料(第乙個資料隨便插入,所以就認為它就是乙個有序數列,不執行插入操作)。每次插的時候,原有的數列已經是有序的了。當插完第八個資料時,排序也就結束了。

折半插入排序本質上就是二分法的應用。例如有一串有序數列,我將插入值與數列中間值比較。倘若大於中間值,說明資料應插入到中間值到最後乙個值之間。倘若小於,說明資料應插入到第乙個值和中間值之間。然後再對相應區間進行同樣的二分操作。這種思想的應用主要是用於:排序、資料查詢。

(1)應用於排序

此處我用了上界與下界來圈定插入資料的範圍。上界與下界其實就是數列中最右側與最左側元素的下標。通過上界與下界的不斷逼近來尋找插入的位置,當上界位於下界左側時,迴圈結束。

舉個栗子:

我現在要將6插入3、5、7、8中。

此時,下界在3這個位置,即下界為0;上界在8這個位置,即上界為3。中界即為(上界+下界)/2,即為1.5 約等於 1,中界在5的位置。然後將6與中界位置的數值比較,發現6>5,說明6應該插入5的右側,此時就將下界移動到7的位置,即下界為2。然後新的中界為2.5約等於2,即在7的位置,因為6<7,所以6應該插入到7的左側,所以將上界移動到5這個位置。此時發現,上界在下界右側,則說明位置已經找到了,所以只需將下界所對應的數值即7之後的數值向後移一位,然後在空出的位置插入6。這樣就又構成了乙個新的有序序列。

(2)應用於查詢

此處我用的是遞迴的思想來構建查詢的函式。首先你將所要查詢的數字與陣列中間的數值比較,倘若大於中間的數值,說明插入的資料位於中間的數值與最大的數值之間;倘若小於中間的數值,說明插入的資料位於最小的數值與中間的數值之間。倘若相等,就直接輸出。然後在得到的對應區間執行相同的操作,如果該資料在數列中,則直到找到這個資料為止;如果不在該序列中,則輸出不存在該值。

注意:查詢也需要上界、下界。

因為只有設定上界與下界,才能知道陣列查詢完成。否則,倘若這個數不在數列中時,遞迴便無法停止,最終導致爆棧。

如果確定所要查詢的數在數列中,好像也可以不設定上界下界,但是我不用上界下界寫的**在搜尋某些值時會出現爆棧,我一時也想不出是什麼原因。所以還是推薦設定上界下界,畢竟這樣的**比較安全。

下面是我的錯誤**,能看出問題的朋友就提出來吧~

void insertsort_find(int x, int

len, int *parr) else

if (x < parr[(len

-1)/2]) else

}

# include 

# include

void insert_sort(int *parr, int len); // 宣告二分法插入排序

void insertsort_find2(int x, int *parr, int low, int up);

int main(void)

printf("before sort: "); // 輸出排序前的陣列

for (int i = 0; i < len; i++)

printf("%d ", parr[i]);

printf("\n");

insert_sort(parr, len); // 呼叫插入排序函式

printf("after sort: "); // 輸出排序後的陣列

for (int i = 0; i < len; i++)

printf("%d ", parr[i]);

printf("\n");

printf("enter the number you want to find:");

scanf("%d", &x);

insertsort_find2(x, parr, 0, len-1);

free(parr);

parr = null;

return0;}

void insert_sort(int *parr, int len) // 對low和up處理使得在決定好插入位置後up在low之前以跳出迴圈

for (int j = i-1; j >= low; j--) // 該迴圈起到將元素後移的作用

parr[j+1] = parr[j];

parr[low] = temp; // 將插入值插入

}return;

}void insertsort_find2(int x, int *parr, int low, int up)

int mid = (up + low)/2;

if (x == parr[mid]) else

if (x < parr[mid]) else

}

這部分內容我也是自學的,在網上找資料的時候覺得別人寫的文章很難理解,花了我不少時間。所以我寫了這一篇博文,希望能幫助你們更好理解二分插入排序的思想。

二分查詢插入排序

採用二分查詢法,找到需要插入的index,以此改進傳統的插入排序方法,如下 include include include using namespace std const int num 20000 template void initarr vector arr template void p...

插入排序之 二分(折半)插入排序(c c )

相比較直接插入排序,二分插入的優勢在於 對待排序數所應該插入的位置的計算是通過二分法來尋找的,這種二分查詢的時間複雜度為o logn 而直接插入是依次尋找位置的,時間複雜度可看作o n 故二分插入排序是一種優化過的插入排序。完整二分插入公升序 如下 includevoid insertsort in...

折半插入排序 C語言

直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中的插入位置,這個 查詢 操作可利用 折半查詢 來實現,由此進行的插人排序稱之為折半插入排序 binary insertion sort 演算法步驟 設待排序的記錄存放在陣列data 1 n 中,data 1 是乙個有序序列。迴圈n 1次,每次使...