每次將乙個待排序的序列插入到乙個前面已排好序的子串行當中
使用到了順序查詢
前面是有序的,逐步逐步將後面的插入到前面去
初始l[1查詢出 l(i]l[1]
l[1]
是乙個已經排好序的子串行
對於元素l(i
)(l(
2)∼l
(n)l(i)\;\;(l(2) \sim l(n)
l(i)(l
(2)∼
l(n)
插入到前面已經排好序的子串行當中
)l(i)
l(i)
在 l[
1...i−
1]l[1...i-1]
l[1...
i−1]
中應該插入的位置 k
kk將l[k
...i
−1]l[k...i-1]
l[k...
i−1]
中所有元素全部後移乙個位置
將l (i
)l(i)
l(i)
複製到l(k
*來自菜鳥教程
最好o (n
)o(n)
o(n)
所有元素有序,一開始就是有序的
平均o (n
2)o(n^2)
o(n2)
最壞o (n
2)o(n^2)
o(n2
) 想要遞增的,結果是遞減的序列
o (1
)o(1)
o(1)
穩定順序儲存和鏈式儲存
優點 : 穩定,相對於氣泡排序與選擇排序更快;
缺點 : 比較次數不一定,比較次數越少,插入點後的資料移動越多,特別是當資料總量大的時候;
c++:
void
insertsort
(elemtype a,
int n)
}
折半插入演算法是對直接插入排序演算法的改進,排序原理同直接插入演算法
使用到了折半查詢,折半查詢相比直接插入排序的順序查詢,效率更高
又稱二分查詢,僅適用於有序的順序表(存放陣列中首先將給定值 key 與表中中間位置元素的關鍵字比較折半查詢只適用於順序儲存,且要求序列一定有序。
若相等,則返回該元素的位置
若不等,則在前半部分或者是後半部分進行查詢
int
binary_search
(seqlist l, elemtype key)
return-1
;}
見**實現
o (n
2)o(n^2)
o(n2)o(1
)o(1)
o(1)
穩定——不影響相對順序,相同的話會插入到後面
順序儲存
c++:
void
binsertsort
(elemtype a,
int n)
// ------------折半查詢----------
// 移動
for(j=i-
1;j>=high+
1;j--
) a[j+1]
= a[j]
; a[high+1]
= a[0]
;// high+1 是最後插入的位置 high+1 也可以用low代替
}}
觀察他們間的小差別
這是插入排序:
void
insertsort
(elemtype a,
int n)
}
這是折半查詢:
int
binary_search
(seqlist l, elemtype key)
return-1
;}
基本上就是在直接插入排序移動元素前,插入了乙個折半查詢,提公升查詢效率
其中的小區別,就是:折半查詢是找到key值相等的那個元素的位置,而在折半插入排序中,使用到折半查詢的目的,是找到應該插入的位置,並不需要key值相同
所找到的位置就是high+1
而為什麼是high+1,而不是low+1,或者mid+1呢?
實際上用low也是可以的
觀察中間的while迴圈,在最後一次迴圈的時候的時候,low == high
此時,low , high , mid 三者是同乙個值
兩種情況
if
(a[mid]
.key > a[0]
.key)
high = mid -1;
else
low = mid +
1;
(1)如果mid的key 大於我們要插入的值的key,那麼情況是
(2)如果mid的key 小於我們要插入的值的key,那麼情況是
直接插入排序與折半插入排序
首先看一下例子,將資料乙個個的插入到乙個列表中,插入後這個列表就排序好了 注意 這個列表是遞增的,而且記憶體空間已分配好,只是沒有填充真正的資料,如下 int insertsort mergetype l,int data for j l len 1 j 0 j else return 0 測試用例...
直接插入排序和折半插入排序
1.直接插入排序 1.1插入排序 insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.1.2 基本過程 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直到i ...
插入排序之直接插入排序和折半插入排序
插入排序的基本思想是 將記錄分為有序和無序兩個序列。從無序序列中任取乙個記錄,然後根據該記錄的關鍵字大小在有序序列中查詢乙個合適的位置,使得該記錄放入這個位置後,這個有序序列仍然有序。每插入乙個記錄就稱為一趟插入排序,經過多趟插入排序,使得無序序列中的記錄全部插入到有序序列中,則排序完成。直接插入排...