一般的快速排序,在最壞的情況下時間複雜度為n2,這在輸入資料有序的情況下會出現,我們應該盡量去避免它。
採取的策略是,在選擇分割點的時候,不再選擇第乙個點或者最後乙個點,而是隨機選擇乙個點,然後將它與第乙個點互換。
#include#includeusing namespace std;
int partition(int *array,int low,int high){
int k=low+rand()%(high-low+1);
int tmp;
tmp=array[k];array[k]=array[low];array[low]=tmp;//隨機選擇乙個點,然後將它與第low個點互換。
int key=array[low];
//上面步驟可以簡化,變於理解寫成這樣
while(lowkey) high--;
array[low]=array[high];
while(low
隨機化快速排序
define max size 100 include include using namespace std 交換指標p1,p2指向的值 void exchange int p1,int p2 pa為指向a的陣列,p,r為下標,對a p.r 進行就地重排,以a r 為主元 劃分為小於主元和大於主元...
演算法導論7 3快速排序的隨機化版本
以下摘自網路 隨機化快排 快速排序的最壞情況基於每次劃分對主元的選擇。基本的快速排序選取第乙個元素作為主元。這樣在陣列已經有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優化方法是隨機化演算法,即隨機選取乙個元素作為主元。這種情況下雖然最壞情況仍然是o n 2 但最壞情況不再依賴於輸入資料,而...
隨機化的快速排序
快排是所有排序演算法中平均效能最好的一種排序,雖然它的最壞的情況和氣泡排序一樣是 n 2。但是平均來說為o n logn 現在研究生又開始學演算法了,主要是隨機演算法,分布式演算法,和概率演算法。第一節課講的是隨機化的快速排序,但是我覺得當n比較小的時候不適合隨機演算法,因為隨機的過程也在花費時間,...