快速選擇演算法

2021-07-05 01:37:30 字數 786 閱讀 3805

摘要:選擇第k小的元素,用快速排序的思想可以以平均o(nlogn)的時間界做到.

(1)首先找到中間值,並且進行排序。

(2)如果左邊的子串行的長度|s1|==k-1,那麼很顯然中間值就是所求.

(3)如果左邊的子串行的長度|s1| >=k,那麼顯然這個所求元素就在子串行s1裡面,遞迴的在s1裡面求解;

(4)如果|s1| < k-1那麼k就在s2中.

(5)如果遇到乙個小的子串行(子串行的長度很小),那麼我們就用插入排序將它排序,然後返回第k個最小元;

**:

void quickselect(int *a,int left,int right,int

order)//選擇第order個最小元

; while(a[--j] > pivot){};

if(i < j)

swap(&a[i],&a[j]);

else

break;

} if (order

< i+1)//注意order排序好之後的下標

quickselect(a,left,i-1,order);

else

if (order > i+1)

quickselect(a,i+1,right,order);

}else

insertsort(a+left,right - left + 1);

}int quicks(int *a,int n,int

order)//快速選擇演算法的驅動例程

快速選擇演算法

快排的每一趟,數軸的左邊都會是 x 的,右邊都是 x 的。左邊元素的個數是 s1 j l 1,如果k s1 的話,那麼下次遞迴的區間就是左邊,否則右邊。直到 l r 時返回q l 時間複雜度 o n c include using namespace std const int n 1e5 10 i...

Quick Selection(快速選擇演算法)

常年見到快速排序演算法,當在普林斯頓大學的網課上看到這個quick selection演算法的時候,直接蒙住了 這個是什麼,和快速排序有什麼關係啊?於是迅速查閱了維基百科,大致了解了其思想,再結合課程中的ppt,終於搞明白了。不得不說這是個很巧妙的演算法,把原先要o nlogn 複雜度的問題,簡化為...

快速選擇演算法c

quick selection演算法和quick sort演算法是由同乙個作者提出,這兩者之間有很大的相似之處 分治,即將問題的規模一次次的減小,直到求出最終解,時間複雜度o n 且資料無需有序。目標 找到第n大的數 隨機產生乙個pivot 根據這個pivot,將小於其值的數放左邊,大於其值的數放右...