quicksort和第k小元素问题

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的话只需在左边递归,否则,则只需要在右边递归。

这是我觉得最经典的代码了。

原文地址:https://www.cnblogs.com/gqdw/p/14417826.html