• 快速排序和快速选择


    快速排序

    该方法的基本思想是:

    1.先从数列中取出一个数作为基准数。

    2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

    3.再对左右区间重复第二步,直到各区间只有一个数

    void qsort(int l,int r){
        if(l==r)return;
        register int tmp,i=l,j=r,mid=x[l+rand()%(r-l+1)];
        while(i<=j){
            while(x[i]<mid)i++;
            while(x[j]>mid)j--;
            if(i<=j){
                tmp=x[i],x[i]=x[j],x[j]=tmp,i++,j--;
            }
        }
        if(l<j)qsort(l,j);
        if(r>i)qsort(i,r);
    }

    快速选择

    该算法主要解决的问题:

    有一个大小为 n的数组A[0,1,2,…,n-1],求其中第/前k大的数。

    主要思想:

    对于快速排序选数交换过后的两部分,有且只有一部分包含第k大的数

    只对包含第k大的数的部分进行选数交换直到找到k

    如果要求前k大的数,就选第k大的数然后前后交换,

    将小于第k大的数的数放到第k大的数的前面,然后快排

    int qselect(int l,int r,int k){
        if(l==r)return x[l];
        register int tmp,i=l,j=r,mid=x[l+rand()%(r-l+1)];
        while(i<=j){
            while(x[i]<mid)i++;
            while(x[j]>mid)j--;
            if(i<=j){
                tmp=x[i],x[i]=x[j],x[j]=tmp,i++,j--;
            }
        }
        if(k<=j)return qselect(l,j,k);
        if(i<=k)return qselect(i,r,k);
        return tmp; 
    }
  • 相关阅读:
    hdu3499---玄学的分层图
    选择合适的最短路--hdu3499
    次小生成树
    poj-1511
    2018SDIBT_国庆个人第六场
    2018SDIBT_国庆个人第五场
    2018SDIBT_国庆个人第四场
    2018SDIBT_国庆个人第三场
    2018SDIBT_国庆个人第二场
    java项目中异常处理情况
  • 原文地址:https://www.cnblogs.com/bennettz/p/7521290.html
Copyright © 2020-2023  润新知