相比較直接插入排序,二分插入的優勢在於:對待排序數所應該插入的位置的計算是通過二分法來尋找的,這種二分查詢的時間複雜度為o(logn);而直接插入是依次尋找位置的,時間複雜度可看作o(n)。
故二分插入排序是一種優化過的插入排序。
完整二分插入公升序**如下:
#includevoid insertsort(int* arr, int num);
int main()
; for (int i = 0; i < 20; i++)
std::cout << '\n';
insertsort(a, 20);
for (int i = 0; i < 20; i++)
return 0;
} //上面的麼得啥用。。。
void insertsort(int* arr, int num)
//***while結束後,下標high+1處為待插入的位置。***
for (j = i - 1; j > high; j--)
arr[j + 1] = arr[j];
arr[high + 1] = temp;}}
}
其中排序函式insertsort中的while迴圈判定條件為low<=high,當迴圈結束後,high+1處為待排序數該插入的位置,然後我們在進行後續的陣列移動,以及插入新數,至此一輪迴圈結束。(其實low始終等於high+1,等於待排序數該插入的位置,故也可以用low來表示插入位置。下面這樣也是可以的
for (j = i - 1; j >=low; j--)
arr[j + 1] = arr[j];
arr[low] = temp;
二分插入排序的時間複雜度為o(
二分插入排序是穩定的,如果你想讓它穩定的話。如果是進行公升序排序的話,下面幾行**不能進行更改,因為一定要先判temp小於arr[mid],這樣就將大於和等於的情況放在else語句裡頭,從而保證了當temp等於arr[mid]時排序的穩定性。
if (temp < arr[mid])
high = mid - 1;
else
low = mid + 1;
不能寫成下面這樣
if (temp > arr[mid])
low = mid + 1;
else
high = mid - 1;
附上降序排序的穩定演算法,如下
void insertsort(int* arr, int num)
for (j = i - 1; j >high; j--)
arr[j + 1] = arr[j];
arr[high+1] = temp;}}
}
Java排序之插入排序 二分 折半插入排序 4
原理 二分插入排序就是插入排序的乙個變種,就是尋找插入排序的位置是採用二分查詢的方式查詢的,都是把整個陣列分為乙個有序的陣列,然後乙個無序的陣列,開始的有序陣列長度為1,然後把無序陣列遍歷,挨個插入有序陣列中,直到所有的數都變成有序的。時間複雜度 其時間複雜度跟插入排序是一樣的 都是o n 2 實現...
排序 3 折半插入排序
參考 排序 0 前言 對插入排序演算法的改進,針對已排序序列,利用二分法進行資料查詢,將待排序資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。設待排序序列大小為n,共遍歷n 1次,i表示當前遍歷的次數,也表示已排序序列的終止位置和待排序序列的起始位置。設定已排序序列開始和末尾...
排序演算法之插入排序2 折半插入排序
我們都知道插入法是在要插入的元素前面都已序的情況下進行比較 插入,直接插入法每個元素都有可能會經歷多次交換才能找到它本應該待的位置。比如第100個元素,假如它應該待的位置為2,如果用直接插入法的話,就要比較99次,搬移98次。然而它前面的99個元素是已序的,顯然有優化的空間,面對已序的序列我們最先想...