快速排序使用分治策略(divide and conquer)來把乙個序列分為兩個子串行。
原理:從序列中挑出乙個元素,作為"基準"(pivot)
把所有比基準值小的元素放在基準前面,所有比基準值大的元素放在基準的後面(相同的數可以到任一邊),這個稱為分割槽(partition)操作
對每個分割槽遞迴地進行步驟1~2,遞迴的結束條件是序列的大小是0或1,這時整體已經被排好序了
<?php
/** * 快速排序
* 資料結構----------------陣列
* 最差時間複雜度-----------每次選取的基準都是最大(或最小)的元素,導致每次只劃分出了乙個分割槽,需要進行n-1次劃分才能結束遞迴,時間複雜度為o(n^2)
* 最優時間複雜度-----------每次選取的基準都是中位數,這樣每次都均勻的劃分出兩個分割槽,只需要logn次劃分就能結束遞迴,時間複雜度為o(nlogn)
* 平均時間複雜度-----------o(nlogn)
* 空間複雜度--------------o(logn)
* 穩定性-----------------不穩定
*/ $arr = [1, 3, 34, 2, 32, 2, 78, -43, 53, -35, 0];
$len = count($arr);
function swap(&$arr, $i, $j)
// 劃分
function partition(&$arr, $left, $right)
} }swap($arr, $tail + 1, $right); // 最後把基準放到前乙個子陣列的後邊,剩下的子陣列即是大於基準的子陣列
return $tail + 1;}
function quicksort(&$arr, $left, $right)
print_r(quicksort($arr, 0, $len - 1));
遞迴 快速排序 快速排序
問題描述 用遞迴來實現快速排序 quick sort 演算法。快速排序演算法的基本思路是 假設要對乙個陣列a進行排序,且a 0 x。首先對陣列中的元素進行調整,使x放在正確的位置上。同時,所有比x小的數都位於它的左邊,所有比x大的數都位於它的右邊。然後對於左 右兩段區域,遞迴地呼叫快速排序演算法來進...
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...