我們都知道插入法是在要插入的元素前面都已序的情況下進行比較—插入,直接插入法每個元素都有可能會經歷多次交換才能找到它本應該待的位置。比如第100個元素,假如它應該待的位置為2,如果用直接插入法的話,就要比較99次,搬移98次。然而它前面的99個元素是已序的,顯然有優化的空間,面對已序的序列我們最先想到的就是二分演算法,我們可以先用二分法找到這個元素應該待的位置,然後一次性的將這個位置後面的元素後移,再將原來第100個元素放入這個位置,這就少了很多比較的開銷。
折半插入法的比較次數與待排序序列的初始狀態無關,僅與數量有關,它的比較次數為o(n*lgn),空間複雜度為o(n)而且這是乙個穩定的演算法。
下面是排序演算法的實現:
#include "compare.hpp"
template
static int binaryfind(t *array, t key, int
left, int
right)
return right;
}template
void binaryinsert(t *array, const
int size)}}
演算法中用到的比較器實現:
template
struct less
};template
struct greater
};
測試**:
void test2()
; int sz = sizeof(arr) / sizeof(arr[0]);
srand((unsigned
int)time(0));
for(int i = 0; i < sz; i++)
for(int i = 0; i < sz; i++)
cout
<< arr[i] << " ";
cout
<< endl << endl << endl << "sort:"
<< endl;
binaryinsert(arr, sz);
for(int i = 0; i < sz; i++)
cout
<< arr[i] << " ";
cout
<< endl;
for(int i = 1; i < sz; i++)
}
這裡最後乙個for迴圈是用於檢測數值經過排序後是否已序,如排序失敗則會打出insert sort error!字樣,並輸出排序出錯的第乙個數字。下面看排序結果:
排序結果正確。
排序 3 折半插入排序
參考 排序 0 前言 對插入排序演算法的改進,針對已排序序列,利用二分法進行資料查詢,將待排序資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。設待排序序列大小為n,共遍歷n 1次,i表示當前遍歷的次數,也表示已排序序列的終止位置和待排序序列的起始位置。設定已排序序列開始和末尾...
Java排序之插入排序 二分 折半插入排序 4
原理 二分插入排序就是插入排序的乙個變種,就是尋找插入排序的位置是採用二分查詢的方式查詢的,都是把整個陣列分為乙個有序的陣列,然後乙個無序的陣列,開始的有序陣列長度為1,然後把無序陣列遍歷,挨個插入有序陣列中,直到所有的數都變成有序的。時間複雜度 其時間複雜度跟插入排序是一樣的 都是o n 2 實現...
插入排序之 二分(折半)插入排序(c c )
相比較直接插入排序,二分插入的優勢在於 對待排序數所應該插入的位置的計算是通過二分法來尋找的,這種二分查詢的時間複雜度為o logn 而直接插入是依次尋找位置的,時間複雜度可看作o n 故二分插入排序是一種優化過的插入排序。完整二分插入公升序 如下 includevoid insertsort in...