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的话只需在左边递归,否则,则只需要在右边递归。
这是我觉得最经典的代码了。