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的話只需在左邊遞歸,否則,則只需要在右邊遞歸。

這是我覺得最經典的代碼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章