直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中的插入位置,這個「查詢」操作可利用「折半查詢」來實現,由此進行的插人排序稱之為折半插入排序( binary insertion sort )。
演算法步驟:
①設待排序的記錄存放在陣列data[1…n]中,data[1]是乙個有序序列。
② 迴圈n-1次,每次使用折半查詢法,查詢data[ i ] ( i=2,…,n )在已排好序的序列datai1…i-1]中的插入位置,然後將data[ i ]插人表長為i-1的有序序列data[1…n-1],直到將data[ n ]插人表長為n-1的有序序列data[ 1…n-1 ],最後得到乙個表長為n的有序序列。
時間複雜度
最好情況:o(nlog
2log_2
log2n)
最壞情況:o(n
2n^2
n2)平均情況:o(n
2n^2
n2)空間複雜度
o(1)
穩定性
穩定完整**如下:
#include
#include
#include
#define maxsize 100
//順序表最大容量,可以自行加大
typedef
struct
elemtype;
//記錄型別
typedef
struct
sqlist;
//順序表
void
initlist
(sqlist &l)
//順序表的初始化
void
createlist
(sqlist &l)
//順序表的建立
scanf
("%d"
,&l.data[l.length]
.key)
;//順序表資料的輸入 if(
getchar()
=='\n'
)//迴圈終止條件
break;}
}void
inputlist
(sqlist l)
//順序表的輸出
printf
("列印為:");
for(i=
1;i<=l.length;i++
)//利用迴圈列印順序表中的資料
printf
("%d "
,l.data[i]
.key);}
void
binsertsort
(sqlist &l)
//對順序表l做折半插入排序
for(j=i-
1;j>=high+
1;j--
) l.data[j+1]
= l.data[j]
;//記錄後移
l.data[j+1]
= l.data[0]
;//將data[0]即data[i],插入到正確位置 }}
(完)
C語言演算法 折半插入排序
折半插入排序演算法思想 折半插入排序演算法思想和直接插入演算法思想大體上一致,將乙個數字插入已經有序的陣列中 不同的地方是,折半插入排序中找插入位置使用的方法是折半查詢演算法。include 折半插入排序演算法 2018.07.22 int main 插入排序演算法下標從一開始 for int i ...
C 折半插入排序
在直接插入的時候,為了給被插入值找到合適的位置,就比較一次,直接決定其往挪走還是不走,比較 移動,就是兩次了。折半將比較和移動分離,先折半找出位置再統一移動。和直接插入一樣的,僅僅優化了找位置的演算法。void insertsort int a,int n 找到位置一樣的操作 for j i 1 j...
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...