zoukankan      html  css  js  c++  java
  • 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的话只需在左边递归,否则,则只需要在右边递归。

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

  • 相关阅读:
    BFS模板 + 力扣例题
    和小吴日常3
    和小吴日常2
    Cocos Creator 学习记录
    js浏览器事件循环机制
    vue+uniapp 项目中一些常用知识
    JSP第一次作业
    Test
    InnoDB存储引擎
    MySQL存储引擎
  • 原文地址:https://www.cnblogs.com/gqdw/p/14417826.html
Copyright © 2011-2022 走看看