求一列数的第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大的数 分治思想 #include #include #include #include #define N 100005 using namespace st...

“求一列数中的第二小的数”

问题:求一列数中的第二小的数 方法:分治法,二分法,每次保留最小的两个数据 现在遇到了一些问题,请各位大神帮忙解下疑惑。 #include #include #include f...

从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小

问题:从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。 解法:这是双端 LIS 问题,用 DP 的思想可解,目标规划函数 max{ b[i] + c[i] }, ...

从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。

提示:双端 LIS 问题,用 DP 的思想可解。 #include using namespace std; void printArray(int* arr, int len) { for (...

双端LIS问题:从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。

从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的。...
  • lampqiu
  • lampqiu
  • 2014年08月14日 10:34
  • 1228

从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。 题目描述:

#include using namespace std; int DoubleEndLIS(int *arr, int len) { int *LIS = new int[len]; ...

从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的

原文地址http://blog.chinaunix.net/uid-26548237-id-3757779.html 分析这个问题,首先要分析的问题是:寻找最长增长字串 1、寻找最长增长字串 分析这个...

一列数求和的XX种写法(c++版)

鲁迅笔下的孔乙己曾经给人讲“茴”字的四种写法,以此证明自己还是个文化人。 作为一个只会写代码的孩子,在一个阳光灿烂的周末,无聊之下就突然想到,在c++中把一列数求和有几种写法那。于是就果断动笔(不对,...

1-11-6 - (1)回文、素数(输出一列数的反序)

问题及代码:   运行结果: 知识点总结: 学习小结:
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求一列数的第k大的数
举报原因:
原因补充:

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