求一列数的第k大的数

原创 2015年11月20日 22:01:39

C/C++实现
类似于快排,也可以说是快排的延伸
比求最大或者最小数的那种算法灵活多了,显然很通用的。

#include<stdio.h>

int partition(int a[],int low,int high)
{
    int pivotkey=a[low];
    while(low<high)
    {
        while(low<high&&a[high]>=pivotkey)
            high--;
        a[low]=a[high];

        while(low<high&&a[high]<=pivotkey)
            low++;
        a[high]=a[low];
    }
    a[low]=pivotkey;
    return low;
}//Partition

int select(int a[],int low,int high,int k)//求第k小的数 
{
    if(low==high)  
        return a[low];  
    int loc=partition(a,low,high);//返回一趟快排后某个基准点的位置  
    int kth=loc-low+1;//该基准数在当前的子数组中是第几小的数  
    if(k==kth)//如果该趟排序后返回的基准位置所处的位置正好是这个子数组的第k小的数  
        return a[loc];//返回处于该位置的值就是要求的第k小的数  
    else if(k<kth)  
        return select(a,low,loc-1,k);//求左边子数组中的第k小的数  
    else 
        return select(a,loc+1,high,k-kth);//求右边子数组中的第k-kth小的数    
}  

void main()
{
    int low=0, high=9, a[]={1,2,3,4,5,6,7,8,9,10},k;
    k=select(a,0,9,5);
    printf("%d",k);
}

寻找第K大的数(快排思想)

使用快排思想找第K大的数,算法复杂度O(n)。1.以数组a的第0位a[0]为参考基准base,将数组划分为两个部分; 如果找第K大的数,则将大于base的数往前挪,将小于base的数往后挪。如果找第...
  • yingyujianmo
  • yingyujianmo
  • 2016年04月15日 22:27
  • 2252

堆的应用!--求第k大数

求一个数列中的第k大的数,将前k个数建最小堆,后面若比堆顶元素还小,则舍去,否则将堆顶置换成该元素,然后维护堆,最后输出堆顶元素~~ 若求第k小的数,则只需建最大堆即可。 #include int...
  • fengsigaoju
  • fengsigaoju
  • 2015年07月16日 19:48
  • 889

求n个数中第k大的数、快速排序

求n个数中第k大的数、快速排序 分类: 数据结构和算法 2011-05-29 15:45 41人阅读 评论(0) 收藏 举报 求n个数中第k大的数 view pla...
  • blizmax6
  • blizmax6
  • 2011年08月08日 21:54
  • 882

求数组中第K大的数

使用快排,第一趟快排过后,右边的元素都比枢轴大,左边的都比枢轴小。当我们要求第K大的数,只需要左边的元素个数是len-k,len是数组总长度。 第一次快排下来,设枢轴位置是mid,如果mid>k,说...
  • liang0000zai
  • liang0000zai
  • 2015年06月25日 15:52
  • 837

使用STL求第K大数

项目上需要使用C++,抽空正好把C++熟悉一下。 期待接下来的这个项目能给我的C++编程能力带来提升。 先来个set版本的。 #include #include #include #i...
  • creater2009
  • creater2009
  • 2012年04月10日 19:36
  • 1274

用快速排序的思想求第K大的数或最大的k个数

#include    using namespace std;   template class T>   int quick2_sort(T a[],int low,int high)   ...
  • guangwen_lv
  • guangwen_lv
  • 2014年09月29日 19:26
  • 2166

在N个乱序数字中查找第k大的数字

在N个乱序数字中查找第k大的数字,时间复杂度可以减小至  O(N*logN)O(N)O(1)O(2) 答案:B 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的...
  • Acceptyly
  • Acceptyly
  • 2015年08月21日 18:57
  • 11194

求第K小/大的数(树状数组解法)

求第K小/大数这个题目经常出现,面试,考试以及OJ上都有类似的题目。 首先声明一点,个人觉得既然是第K小(大是一样的),那么重复的元素就不应该算了,当然如果算了就相对简单一些。。 最原始的解法,快...
  • xueerfei008
  • xueerfei008
  • 2013年09月25日 23:05
  • 4615

找出数组中第k大的数

给定一个数组,找出数组中第k大的数。其实现代码如下: package com.threeTop.www; /** * 找出数组中第k大的数 * @author wjgs * */ publi...
  • u012017783
  • u012017783
  • 2017年05月05日 21:40
  • 404

HDU 2665 主席树(求区间第k大模板)

题意:给出一串长度为n的序列,并给出m个询问,每个询问针对序列中一段区间[s,t],求这区间中第k小的数字是多少。思路:非常经典的主席树问题。 主席树正规的名字是可持久化线段树,形象来说就是将线段树...
  • Bahuia
  • Bahuia
  • 2017年08月23日 18:36
  • 189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求一列数的第k大的数
举报原因:
原因补充:

(最多只允许输入30个字)