1. 程式人生 > >插入排序——二分查詢排序(BinarySearchSort)

插入排序——二分查詢排序(BinarySearchSort)

原理:首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

<?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));