快排以及查找第K元素

1.快排。

快排,合并排序什么的必须熟练掌握啊,这么经典的算法。。。

int qsort_aux(int A[],int p,int q) {
        //选择最后一个元素x做为参照,将小于x和大于x的元素放在x两侧
    int i=p-1,j,x=A[q];
    for(j=p;j<q;j++) {
        if(A[p]<=x) swap(A[++i],A[j]);
    }
    swap(A[++i],A[q]);
        //返回x所在的位置,则左边的元素小于x,右边的大于x
    return i;
}
                                 
void qsort_complete(int A[],int p,int q) {
    if(p<r) {
        int r=qsort_aux(A,p,q);
        qsort_complete(A,p,r-1);
        qsort_complete(A,r+1,q);
    }
}

2.寻找第k元素。

第一种简单的想法是先将数组排序,再取第k小元素,根据不同的算法可以知道这种算法的时

间复杂度。如果用快排、合并排序堆排序什么的,时间复杂度为O(NlgN);如过用冒泡或者

插入排序,时间复杂度为O(N^2);当然也有些线性时间排序算法,但是限制条件比较多不

常用。

第二种是采用快排的思想。选取一个数做为参照,把数组元素分为两边,直到找到第k个元素。

这样的时间复杂度为T(n)=O(n*(1+1/2+1/2^2+1/2^3+...1/2^lgn))(这尼玛不会算,囧了。。

)显然有T(n)<O(nlgn)。

int kth_elem(int A[],int n,int k) {
    int low=0,high=n-1;
    int i,j,x;
        //和快排的思想一致,先选取一个数做为参照,分在两边,直到找到第k个元素。这样就可以不用先排序,再去第ku元素。
    while(low<=high) {
        i=low-1;    x=A[high];
        for(j=low;j<=high;j++) {
            if(A[j]<=x) swap(A[++i],A[j]);
        }
        swap(A[++i],A[j]);
        if(i==k)        return A[i];
        else if(i<k) low=i+1;
        else            high=i-1;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值