用快速排序的思想输出数组第k大的元素:

 #include<iostream>
#include<algorithm>
using namespace std; //递归实现:返回数组第k大的值.数组下标区间是[begin,end].其中数组假定n个元素,则k的值在区间[1,n].
//能够使用这种方法的前提条件是:n个数不能重复。如果n个数中有重复,那么区间的大小不能保证就是第K大。
int findkth(int* arr, int begin, int end, int k)
{
int key=arr[begin];
int i=begin,j=end;
while(i<j)
{
while(i<j && arr[j]<=key) j--;
arr[i]=arr[j];
while(i<j && arr[i]>=key) i++;
arr[j]=arr[i];
}
arr[i]=key; //递归的结束条件为某一记录刚好划分到第k个位置
//由于数组从0开始,所以需要加1了
if (i == k-)return arr[i];
else if (i < k-) return findkth(arr, i+, end, k);
else return findkth(arr, begin, i-, k);
} //只做了一轮划分,没有递归完成快速排序.返回的是划分的下标。数组a[]下标区间[low,high]
template <class T>
int partition(T a[],int low,int high)
{
T key=a[low];
int i=low,j=high;
while(i<j)
{
while(i<j && a[j]>=key) j--;
a[i]=a[j];
while(i<j && a[i]<=key) i++;
a[j]=a[i];
}
a[i]=key;
return i;
} //利用快速排序的思想查找第K大的数值
//第一个参数代表要查找的数组
//第二个参数代表数组的长度
//第三个参数代表要查找第几大的元素
//非递归
template <class T>
T findkth2(T a[],int n,int k)
{
int low=,high=n-;
while()
{
int pos=partition(a,low,high);
if(pos==n-k) return a[pos];
else if(pos<n-k)
{
low=pos+;
high=n-;
}
else if(pos>n-k)
{
high=pos-;
low=;
}
}
} int main()
{
int a[]={,,,,,,,,,,};
int b[]={,,,,,,,,,,};
int c[]={,,,,,,,,,,}; for(int i=;i<;i++) cout<<a[i]<<" ";
cout<<endl;
sort(a,a+);
for(int i=;i<;i++) cout<<a[i]<<" ";
cout<<endl; for(int i=;i>=;i--)
cout<<findkth(b,,,i)<<" ";
cout<<endl; for(int i=;i>=;i--)
cout<<findkth2(c,,i)<<" ";
cout<<endl; cout<<endl<<endl;
for(int i=;i<;i++) cout<<b[i]<<" ";
cout<<endl;
for(int i=;i<;i++) cout<<c[i]<<" ";
cout<<endl;
return ;
}

参考:http://blog.csdn.net/guangwen_lv/article/details/39674241

利用快速排序的特点:第一遍排序会确定一个数的位置,这个数左边都比它大,右边都比他小(降序),当左边区间大于K时,说明我们求的第K大数在左边区间,这时我们可以舍弃右边区间,将范围缩小到左边区间从而重复上述过程,直到确定一个数的位置时,左边区间的小是K-1那么这个数字就是我们所求。右边同理。

能够使用这种方法的前提条件是:n个数不能重复。如果n个数中有重复,那么区间的大小不能保证就是第K大。可以用HASH判重来将重复的数据去掉。然后再使用上述方法。

也可阅读如下另一位网友的java代码:

 /** * Created with IntelliJ IDEA.
* User: hqtc
* Date: 16-3-22
* Time: 下午9:52
* To change this template use File | Settings | File Templates.
*/
public class QuickSort{ private int getSeparatorIndex(int[] nums, int low, int high) {
int k = nums[low];
while (low < high) {
while (k < nums[high] && low < high) {
high--;
}
if (low < high)
nums[low++] = nums[high];
while (k > nums[low] && low < high) {
low++;
}
if (low < high)
nums[high--] = nums[low];
}
nums[low] = k;
return low;
} public void sort(int num[], int low, int high) {
if (low < high) {
int sepIndex = getSeparatorIndex(num, low, high);
sort(num, low, sepIndex - 1);
sort(num, sepIndex + 1, high);
}
} public int findKthMax(int arr[], int k, int left, int right) {
int sepIndex = getSeparatorIndex(arr, left, right);
if (k == arr.length - sepIndex) {
return arr[sepIndex];
} else {
if (k > arr.length - sepIndex) {
return findKthMax(arr, k, left, sepIndex - 1);
} else {
return findKthMax(arr, k, sepIndex + 1, right);
}
}
}
} /*作者:环球探测
链接:http://www.jianshu.com/p/9f887dfc374a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

输出数组第k大的元素的更多相关文章

  1. 力扣:丑数II和数组中前K大的元素

    数组中的第K个元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k ...

  2. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

  3. 获取一个数组里面第K大的元素

    如何在O(n)内获取一个数组比如{9, 1, 2, 8, 7, 3, 6, 4, 3, 5, 0, 9, 19, 39, 25, 34, 17, 24, 23, 34, 20}里面第K大的元素呢? 我 ...

  4. [LeetCode] Kth Largest Element in a Stream 数据流中的第K大的元素

    Design a class to find the kth largest element in a stream. Note that it is the kth largest element ...

  5. LeetCode703 流中第k大的元素

    前言: 我们已经介绍了二叉搜索树的相关特性,以及如何在二叉搜索树中实现一些基本操作,比如搜索.插入和删除.熟悉了这些基本概念之后,相信你已经能够成功运用它们来解决二叉搜索树问题. 二叉搜索树的有优点是 ...

  6. POJ 2985 Treap平衡树(求第k大的元素)

    这题也能够用树状数组做,并且树状数组姿势更加优美.代码更加少,只是这个Treap树就是求第K大元素的专家--所以速度比較快. 这个也是从那本红书上拿的模板--自己找了资料百度了好久,才理解这个Trea ...

  7. 2.4 选择第k大的元素 selection

    1.目标:找到N个元素中,第k大的数. 例如:max是k=N--1:min是k=0:median是k=N/2 2.Quick-select 借鉴了快速排序的思想 (1)利用partition保证: ① ...

  8. [leetcode]215. Kth Largest Element in an Array 数组中第k大的元素

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  9. hrbust 1840 (树状数组第k大) 删点使用

    小橙子 Time Limit: 2000 MS Memory Limit: 32768 K Total Submit: 2(2 users) Total Accepted: 1(1 users) Ra ...

随机推荐

  1. [转]在Windows中安装PhpUnit

    FROM : http://www.cnblogs.com/heiing/archive/2012/09/07/2674807.html 步骤: 安装 pear ,参见http://www.cnblo ...

  2. [转]nginx下的url rewrite

    转:http://zhengdl126.iteye.com/blog/698206 if (!-e $request_filename){rewrite "^/index\.html&quo ...

  3. django的mysql设置和mysql服务器闲置时间设置

    服务器启动后,每个进程都会主动连接到mysql,要是长时间没有数据交互,mysql会自动断开连接. show variables like  '%timeout%'; 闲置连接的超时时间由wait_t ...

  4. 第二章 logstash - 输出插件之redis与es

    最常用的两个输出插件: redis es 一.redis 1.用法 output { redis{ batch => false batch_events => 50 batch_time ...

  5. http://download.csdn.net/detail/yanzi1225627/6548337

    [2013.9.8网络首发]导入Android4.2源码里的Gallery2和Camera模块至Eclipse全过程 上次导入的时候是新建的一个user library,然后把所需要的四个库文件放里面 ...

  6. ScaleIO 1.32现在可以免费下载安装使用了(除生产环境之外)

    EMC World 2015会上宣布, ScaleIO 1.32可以免费下载使用在非生产环境上了. 这个可以免费下载的版本叫做Free and Drictionless (F&F) downl ...

  7. 遮罩层中的相对定位与绝对定位(Ajax)

    前提:公司最近做的一个项目列表,然后点击项目,出现背景遮罩层,弹出的数据框需要异步加载数据数据,让这个数据框居中,搞了两天终于总算达到Boss满意的程度,做了半年C/S,反过来做B/S,顿时感到技术还 ...

  8. vue使用watch 观察路由变化,重新获取内容

    watch: { $route(to) { console.log(to) if (to.path.indexOf('index') != -1) { //路由变化后重新获取帖子列表 this.$ht ...

  9. pThreads线程(三) 线程同步--条件变量

    条件变量(Condition Variables) 参考资料:http://game-lab.org/posts/posix-thread-cn/#5.1 条件变量是什么? 条件变量为我们提供了另一种 ...

  10. Mac关闭摄像头

    为了防止黑客入侵,我们可以手动执行命令,关掉摄像头设备的访问权限,让黑客去看黑夜吧. Mac关闭禁用摄像头的方法,打开终端,拷贝如下代码,回车,输入管理员密码,再次拷贝,回车. sudo chmod ...