直接插入排序以及折半插入排序詳解

2021-10-03 13:16:58 字數 3029 閱讀 4158

每次將乙個待排序的序列插入到乙個前面已排好序的子串行當中

使用到了順序查詢

前面是有序的,逐步逐步將後面的插入到前面去

初始l[1

]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(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 ...

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

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