直接插入排序和折半插入排序演算法

2021-09-23 21:41:48 字數 1628 閱讀 8792

直接插入排序(insertion sort)的基本思想是:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。

設陣列為a[0…n-1]。

1. 初始時,a[0]自成1個有序區,無序區為a[1..n-1]。令i=1

2. 將a[i]併入當前的有序區a[0…i-1]中形成a[0…i]的有序區間。

3. i++並重複第二步直到i==n-1。排序完成。

演算法實現(c語言):

//

completed on 2014.10.10 07:45

//language: c99

////

//#include#includevoid insertsort(int *a, int n)

if(j != i - 1)

}}void printarray(int *a, int n)

printf("

\n");

}int main()

; insertsort(a, 7);

printarray(a, 7);

return

0;}

基本概念折半插入排序(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)。

演算法實現(c語言):

//

completed on 2014.10.10 08:00

//language: c99

////

//#include#includevoid binaryinsertsort(int *a, int n)

if(j != i - 1)

}}void printarray(int *a, int n)

printf("

\n");

}int main()

; binaryinsertsort(a, 7);

printarray(a, 7);

return

0;}

直接插入排序和折半插入排序

1.直接插入排序 1.1插入排序 insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.1.2 基本過程 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直到i ...

插入排序之直接插入排序和折半插入排序

插入排序的基本思想是 將記錄分為有序和無序兩個序列。從無序序列中任取乙個記錄,然後根據該記錄的關鍵字大小在有序序列中查詢乙個合適的位置,使得該記錄放入這個位置後,這個有序序列仍然有序。每插入乙個記錄就稱為一趟插入排序,經過多趟插入排序,使得無序序列中的記錄全部插入到有序序列中,則排序完成。直接插入排...

直接插入排序 改進演算法 折半插入排序

這種改進是從比較次數入手的,並沒用減少移動的次數 include define maxsize 20 typedef int keytype typedef struct sqlist void createsqlist sqlist l l.length n void display sqlist...