折半 二路插入排序

2022-08-23 19:48:13 字數 2045 閱讀 1744

折半插入排序:直接插入排序是將待插入元素與前面的元素一一比較,尋找合適的位置插入。而折半插入是通過折半來查詢位置,所謂折半(可以參考二分查詢)就是定義兩個變數分別指向頭start和尾end,取其中間值mid。如果待插入元素大於mid位置上的元素就這mid和end之間再查詢,如果小於,則在start和mid之間查詢。然後不斷縮小範圍,直到尋找到合適的位置(大於左邊小於右邊),然後就是元素的插入。

1 #include2

#define n 634

5void binaryinsertsort(int

num)

1819

if(start>mid) //

如果start>mid,說明待插入元素比mid位置的元素大,但比mid+1位置上的元素小

20 mid++; //

此時插入位置應該是mid+1

21//

還有一種情況就是end22

//此時插入位置應該是mid

2324 t = num[i]; //

此處就是元素的插入

25for(j=i-1;j>=mid;j--) //

使用直接插入排序**思想在此處插入元素

26 num[j+1] =num[j];

27 num[j+1] =t;

2829}30

31 }

二路插入排序:前面的插入排序每次插入元素的時候都會移動較多的元素,二路插入排序對其進行了改善。思路是:以第乙個元素作為比較元素,後面所有大於該元素的數全部放在前面,所有小於元素的數放在後面,大於或小於部分的元素在插入的時候使用直接插入排序來保證有序,當所有元素分配好後,其實陣列已經變成兩個有序區,在組合好就完成排序了。

定義first、final指向兩個有序區,**如下:

臨時存放陣列比原有陣列多乙個空間

8 first = 0; //

first、final分別指向臨時存放陣列的開頭和結尾

9 final =n;

10 temp[0] = num[0]; //

陣列第乙個元素作為比較元素

1112

for(i=1;i)

19 temp[j+1] =num[i];

20 first++;21}

22else

29 temp[j-1] =num[i];

30 final--; //

final作為小於第乙個元素的數的最前元素的下標

31 } //

但final指向了最前元素的前乙個位置 32}

3334

for(i=0;i1-first;i++) //

將臨時陣列存放到原來的陣列

35 num[i] = temp[++final];

3637

for(j=0;i)

38 num[i] =temp[j];

3940}41

42void

main();

45twoinsertsort(num);

4647

for(i=0;i)

48 printf("

%d "

,num[i]);

4950 }

插入排序 直接,折半,二路,希爾

插入排序 給出一下四種方法 直接插入排序,折半插入排序,二路插入排序,希爾插入排序 實現 cpp view plain copy print?include using namespace std define size 21 typedef intsqlist size void sinserts...

二路插入排序

插入排序時需要移動大量元素。為此可用乙個輔助的迴圈陣列來減少元素的移動次數。具體做法如下,對於乙個待排序的陣列a,我們首先找到乙個與a相同大小的迴圈陣列。然後按照以下操作進行。1.令b 0 a 0 因為乙個元素總是有序的。2.令兩個指標first和final指向b中已存在元素的最大和最小值。3.對於...

插入排序 折半插入排序

折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...