思路
在陣列中設定乙個基準元素和兩個哨兵,利用哨兵機制將比基準元素小的元素移動到基準元素左側,比基準元素大的元素移動到基準元素右側,然後把基準元素放到正確的位置,然後用遞迴對基準元素兩側的序列進行排序。
**(1) 將序列的第乙個元素作為基準元素(常用)
此時序列最右邊的哨兵要先動,原因見此篇分析:快速排序解惑——哨兵出發的順序,簡單地說就是確保與基準元素交換位置的那個元素,小於或者等於基準元素。
(2) 隨機選擇基準元素public
static
void
quicksort
(int
arr,
int leftborder,
int rightborder)
while
(left < right && arr[left]
<= key)
if(left < right)}if
(leftborder != left)
quicksort
(arr, leftborder, left-1)
;quicksort
(arr, left+
1, rightborder);}
}
在序列中隨機選擇乙個元素作為基準元素,再將該元素與序列的第乙個元素交換,此時序列中的第乙個元素為基準元素,這樣就把問題轉化到了情況(1)。
效能分析public
static
void
quicksortrandom
(int
arr,
int leftborder,
int rightborder)
while
(left < right)
while
(left < right && arr[left]
<= key)
if(left < right)}if
(left != leftborder)
quicksort
(arr, leftborder, left-1)
;quicksort
(arr, left+
1, rightborder);}
}public
static
intgetrandomindex
(int start,
int end)
時間複雜度:
空間複雜度:o(1
)o(1)
o(1)
穩定性:不穩定,例如5, 1, 1,後面的乙個1會被移動到陣列的第乙個位置。
隨機快速排序
問題畫出來小於區域和等於區域,劃偏 1,2,3,4,5,6,7 7 7 總拿最後乙個劃分,跟資料狀況有關,比較差的蛻變程o n 2 6,5,4,3,2,1 1,1 資料分布比較差 比價好的情況 x t n 2t n 2 o n n nlogn 隨機快速排序 隨機選擇乙個數和最後乙個替換一下 長期期望...
快速排序和隨機快速排序
嚴書上的快排是以最左邊元素為樞紐的,如下 include include using namespace std intpartition int a,int left,int right a left p return left void quicksort int a,int left,int ...
快速排序與隨機快速排序
實現對陣列的普通快速排序與隨機快速排序。1 實現上述兩個演算法 2 統計演算法的執行時間 3 分析效能差異,作出總結 一 快速排序 通過使用分治思想對快速排序演算法進行描述。下面對乙個典型的子陣列a p r 進行快速排序的三步分治過程 分解 陣列a p r 被劃分為兩個 可能為空 子陣列a p q ...