C 排序系列(一) 插入排序之折半插入排序

2022-06-01 20:30:08 字數 801 閱讀 9997

鄭重宣告:本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!

折半插入排序(binary insertion sort)是對插入排序演算法的一種改進,由於排序演算法過程中,就是不斷的依次將元素插入前面已排好序的序列中。由於前半部分為已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查詢的方法來加快尋找插入點的速度。

在將乙個新元素插入已排好序的陣列的過程中,尋找插入點時,將待插入區域的首元素設定為a[low],末元素設定為a[high],則輪比較時將待插入元素與a[m],其中m=(low+high)/2相比較,如果比參考元素小,則選擇a[low]到a[m-1]為新的插入區域(即high=m-1),否則選擇a[m+1]到a[high]為新的插入區域(即low=m+1),如此直至low<=high不成立,

即將此位置之後所有元素後移一位,並將新元素插入a[high+1]。

折半插入排序演算法是一種穩定的排序演算法,比直接插入演算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序演算法快,但記錄移動的次數沒有變,所以折半插入排序演算法的時間複雜度仍然為o(n^2),與直接插入排序演算法相同。附加空間o(1)。

實現**:

1 template 2

void binary_insert_sort(t v, const

intsz)317

else

1821}22

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

2427 v[high+1] = tmp; //

插入28

}29 }

排序演算法 一 插入排序法 折半插入排序法

約定 假設資料中有n個資料元素 關鍵字 排列演算法中,將序列中各關鍵字值依次存放於型別為keytype的陣列元素k 1 k 2 k 3 k n 中。排序結果按照資料元素 關鍵字 值的大小,從小到大排序。核心思想 第 i 趟排序將序列中第 i 1 個元素 ki 1 i 1,2,n 1 插入到乙個已經按...

C 排序系列(一) 插入排序之直接插入排序

鄭重宣告 本文是筆者根據個人理解所寫,錯誤難免,歡迎拍磚!演算法思想 直接插入排序 straight insertion sort 的作法是 每次從無序表中取出第乙個元素,把它插入到有序表的合適位置,使有序表仍然有序。第一趟比較前兩個數,然後把第二個數按大小插入到有序表中 第二趟把第三個資料與前兩個...

排序(一)插入排序

繼插入排序 這裡說一下折半插入排序。從前面的迴圈中可以看出直接插入排序是邊比較邊移動的。這裡講的折半插入排序則是將比較和移動分開。不斷的折半查詢定位再一次性的移動元素,最終插入元素 void insertsort int a,int n else 中間元素小於要插入的元素,則在後半部分 for j ...