二分查詢插入排序

2021-08-11 12:19:56 字數 1208 閱讀 7303

採用二分查詢法,找到需要插入的index,以此改進傳統的插入排序方法,**如下:

#include 

#include

#include

using

namespace

std;

const

int num = 20000;

template

void initarr(vector

&arr)

}template

void printarr(const

vector

&arr)

cout

<< endl;

}template

void insersort(vector

&arr)

arr[i+1] = key;

}}template

int binarysearch(const

vector

&arr, int start, int end, t k) else

}return start;

}template

void insersort2(vector

&arr)

arr[insertindex] = tmp;}}

}int main()

執行結果如下:

結果表明,在資料量較大的情況下,二分查詢插入排序的效率更高。

3.2. 複雜度分析

我們這個二分查詢的演算法並不會因為等於某乙個值而停止查詢,它將查詢整個序列直到start<=end條件不滿足而得到插入的位置,所以對於長度為n的陣列來說,比較次數為log2n ,時間複雜度為o(log2n)。二分插入排序的主要操作為比較+後移賦值,則:

最壞情況:每次都在有序序列的起始位置插入,則整個有序序列的元素需要後移,時間複雜度為o(n^2)

最好情況:待排序陣列本身就是正序的,每個元素所在位置即為它的插入位置,此時時間複雜度僅為比較時的時間複雜度,為o(log2n)

平均情況:o(n^2)

空間複雜度上, 二分插入排序也是就地排序演算法,它的空間複雜度為o(1).

3.3. 穩定性

二分插入排序是穩定的。元素的相對順序在排序後不會被改變。

插入排序和二分查詢

在插入資料時,用二分查詢法查詢資料,而不是一一比較。意外收穫 條件 資料從小到大,假設a a.length 為無窮大。二分查詢時,找不到,則左右索引最後相等,目標資料會比當前索引指向的資料小。public static void insertsortwithbinarysearch int a fo...

二分插入排序和二分查詢

1.二分插入排序 二分插入排序其實是直接插入排序的改進,在前面已排好的佇列中,以二分查詢的形式插入待排序資料 2.二分查詢 在有序序列中查詢值是否存在,是將序列不斷分成兩部分進行查詢 下面直接貼 include 二分插入排序 void binsertsort int a,int c 此時left所在...

插入排序 簡單插入排序 二分插入排序

1 假設我們手裡的數字是一堆亂序撲克牌,我們想把它整理成從小到大的排序,會怎麼辦呢,我們會從左往右挨個將牌抽出來插到它合適的位置,這樣一輪之後,就變成從小到大的順序了。2 程式上怎麼實現,從第二位開始,逐個將後乙個數和它之前所有的資料進行比較,尋找這個數最合適的插入位置,將其插入空隙,後面的值依次會...