插入排序——二分查詢排序(BinarySearchSort)
阿新 • • 發佈:2018-11-08
原理:首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。
<?php /** * 二分查詢排序 * 資料結構----------------陣列 * 最差時間複雜度-----------O(n^2) * 最優時間複雜度-----------O(nlogn) * 平均時間複雜度-----------O(n^2) * 空間複雜度--------------O(1) * 穩定性-----------------穩定 */ $arr = [1, 3, 34, 2, 32, 2, 78, -43, 53, -35, 0]; function BinarySearchSort($arr) { // 陣列第一個元素預設已被排序 for ($i = 1; $i < count($arr); $i++) { // 未排列序列從陣列第二個元素開始 $get = $arr[$i]; // 獲取未排列序列第一個元素為要比較元素 $left = 0; // 定義已排列序列左邊界 $right = $i -1; // 右邊界 while ($left <= $right) { $mid = floor(($left + $right) / 2); // 定義中間數,將已排列序列一分為二 if ($arr[$mid] > $get) { // 如果中間數大於比較元素,則比較元素屬於前半段 $right = $mid -1; // 右邊界左移 } else { // 否則比較元素屬於後半段 $left = $mid + 1; // 左邊界右移 } } for ($j = $i -1; $j >= $left; $j--) { // 最後的$left就是待插入位置 $arr[$j + 1] = $arr[$j]; // 將待插入位置的右邊整體向右移動一個單位 } $arr[$left] = $get; // 將比較元素插入該空位 } return $arr; } print_r(BinarySearchSort($arr));