快速排序(原始 隨機)

2021-10-08 01:21:42 字數 1400 閱讀 4401

思路

在陣列中設定乙個基準元素和兩個哨兵,利用哨兵機制將比基準元素小的元素移動到基準元素左側,比基準元素大的元素移動到基準元素右側,然後把基準元素放到正確的位置,然後用遞迴對基準元素兩側的序列進行排序。

**(1) 將序列的第乙個元素作為基準元素(常用)

此時序列最右邊的哨兵要先動,原因見此篇分析:快速排序解惑——哨兵出發的順序,簡單地說就是確保與基準元素交換位置的那個元素,小於或者等於基準元素。

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

}

(2) 隨機選擇基準元素

在序列中隨機選擇乙個元素作為基準元素,再將該元素與序列的第乙個元素交換,此時序列中的第乙個元素為基準元素,這樣就把問題轉化到了情況(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 ...