quicksort和第k小元素問題
1. 超好用的模板
int partition(int a[],int l,int r){
// 這裏i 是l-1 ,不會越界,因爲下面是++i, i會先加。j也會先減,因爲是以右邊的元素作爲劃分點。
int i = l-1, j=r;
int v = a[r];
// 找到i,j ,swap ,使得劃分點左邊的都小於v,右邊的都大於v。
// 這裏也可以改成while(true)
for (;;){
while (a[++i]<v);
while (a[--j]>v) if (j==l)break;
if (i>=j)break;
swap(a[i],a[j]);
}
// 交換a[i],a[r],
swap(a[i],a[r]);
// 劃分完了, 將i 返回,遞歸quicksort
return i;
}
void quicksort(int a[],int l, int r){
int i;
if (r<=l)return;
// 劃分
i = partition(a,l,r);
// 遞歸
quicksort(a,l,i-1);
quicksort(a,i+1,r);
}
取自<算法: c語言描述>
2. kth
然後這個模板稍微改一下,就能就kth 問題。
void select(int a[],int l,int r,int k){
int i;
if(r<=l)return ;
i = partition(a,l,r);
if (i>k)select(a,l,i-1,k);
else select(a,i+1,r,k);
}
這裏跟quicksort非常相似, 只是遞歸時候判斷i 是否大於k, 大於k的話只需在左邊遞歸,否則,則只需要在右邊遞歸。
這是我覺得最經典的代碼了。