寻找第k大数(快排思想)

原创 2013年12月04日 20:21:56

剔除了相同的数,快排是从小到大排序的,所以k做了处理。

#include <iostream>
#include <cstdio>
using namespace std;

int hash[20000005]={0};
int A[10000005];
int counter=0;
int k;

int partition(int *A,int l,int r)
{
    int x=A[r];
    int i,j;
    int temp;
    i=l-1;
    for (j=l;j<=r-1;j++)
        if (A[j]<=x && j!=i)
        {
            i=i+1;
            temp=A[j];
            A[j]=A[i];
            A[i]=temp;
        }
    temp=A[i+1];
    A[i+1]=A[r];
    A[r]=temp;
    return i+1;
}

int quick_sort(int *A,int l,int r)
{
  int mid;
  mid=partition(A,l,r);
  if (mid==k-1)
    return A[mid];
  else if (mid>k-1)
    return quick_sort(A,l,mid-1);
  else
    return quick_sort(A,mid+1,r);
}

int main()
{
  int n;
  scanf("%d%d",&n,&k);
  int i;
  int a;

  for (i=0;i<=n-1;i++)
  {
    scanf("%d",&a);
    if (!hash[a+10000000])
    {
    	hash[a+10000000]=1;
    	A[counter++]=a;
    }
  }

  k=counter-k+1;
  printf("%d\n",quick_sort(A,0,counter-1));

  return 0;
}



相关文章推荐

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

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

算法设计:如何求数组中第i大 或 第i小的数 (续上)

http://blog.csdn.net/yanzi1225627/article/details/8111806 、http://www.eyeandroid.com/thread-9629-1-1...

寻找第k大数字

1003. 寻找第k大数字(numberk)
  • t6_17
  • t6_17
  • 2016年12月10日 14:20
  • 678

2016/12/8 1004. 寻找第k大数字(numberk)

这个问题有很多博客讨论了,这里是STL拯救世界,直接构造出了优先序列。以后还是认真看看这个问题吧。 // Problem#: 19855 // Submission#: 4951919 // The...

算法-寻找第K大的数的方法总结

转载:http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大...

[C++日常小题] 寻找第k大数字(numberk)

Description经过长时间的筹备工作,在Jourk,Ronny,Plipala,阿长,阿沈等人的努力下,DM实验室建立起自己的系列网站,其中包括三个大板块:DMOJ首页、DMOJ论坛、DMOJ博...

#sicily#1001.寻找第k大数字(numberk)

source:http://soj.sysu.edu.cn/show_problem.php?pid=1001&cid=2449 密码:gjr题目Description经过长时间的筹备工作,在Jour...

找最轻最重 快排思想 第K大

【金块问题】有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入...

从n个元素中找出第K小的数 利用快排的思想来实现

从n个无序的顺序表中找出第k小的数,采用快排思想: 先从n个元素中随便寻找一个数m作为分界点,m在列表中的位置为i 当 i = k时,m就是我们要寻找的第k小的数; 当 i > k时,我们就从1~i-...

快排算法及利用快排思想寻找第k大(小)的数

#include #include using namespace std; void Swap(int &a, int &b) { int p = a; a = b; b = p; } ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:寻找第k大数(快排思想)
举报原因:
原因补充:

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