採用二分查詢法,找到需要插入的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 程式上怎麼實現,從第二位開始,逐個將後乙個數和它之前所有的資料進行比較,尋找這個數最合適的插入位置,將其插入空隙,後面的值依次會...