(转)基于快速排序的TOPK算法
2015-03-22 16:37
113 查看
基于快速排序的TOPK算法
转自:http://blog.csdn.net/fanzitao/article/details/7617223
思想:
类似于快速排序,首先选择一个划分元,如果这个划分元的序号index刚好等于k,那么这个划分元以及左边的数,刚好组成了top-k small data;如果index>k, 那top-k small data在index的左边,那么就继续递归从index-1和数中选取top-k.如果index < k,那么说明还要从index的右边,选取top-(k-index) small data.
代码如下:
View Code
学习之处:
二分查找subroutine还可以用于寻找Top K问题。
别人代码里面二分查找实现是非递归的!
转自:http://blog.csdn.net/fanzitao/article/details/7617223
思想:
类似于快速排序,首先选择一个划分元,如果这个划分元的序号index刚好等于k,那么这个划分元以及左边的数,刚好组成了top-k small data;如果index>k, 那top-k small data在index的左边,那么就继续递归从index-1和数中选取top-k.如果index < k,那么说明还要从index的右边,选取top-(k-index) small data.
代码如下:
public class TopK_Quick { public static int Partition(int a[],int low,int high) { a[0]=a[low]; int pivokey = a[low]; while(low<high) { while(low<high && a[high]>=pivokey) --high; a[low] = a[high]; while(low<high && a[low]<=pivokey) ++low; a[high]= a[low]; } a[low]=a[0]; return low; } public static void display(int a[],int k) { for(int i=1;i<=k;i++) { System.out.print(a[i]+" "); } } public static int selectK(int a[],int start,int end,int k) { int index = 0; if(start<end) { index = Partition(a,start,end); if(index == k)//正好找到第k大的数 { index = k; }else if(index < k)//还要从index的右边找k-index个数 { index = selectK(a,index+1,end,k-index); }else if(index > k)//k个数都在Index的左边 { index = selectK(a,start,index-1,k); } } return index; } public static void main(String args[]) { int k=0; int a[]={0,49,38,29,65,97,76,13,27,49,22,19}; if(k>0&&k<=a.length-1) { selectK(a,1,a.length-1,k); display(a,k); }else{ System.out.println("Are You Kidding Me?"); } } }
View Code
学习之处:
二分查找subroutine还可以用于寻找Top K问题。
别人代码里面二分查找实现是非递归的!
相关文章推荐
- 算法兴趣----- 一亿数据获取前100个最大值(仅供参考,基于快速排序的实现时间不稳定,基于最小堆实现。如果我们只要求前K个最大(小)值的时候,用堆是最好的选择,因为这里不用每次都排序了)
- 基于快速排序的几种算法变型
- 算法实践篇-基于快速排序原理的选择第i小元选择算法
- Java编程基于快速排序的三个算法题实例代码
- 基于快速排序思想的三个算法题
- 基于JAVA的排序算法之五--快速排序
- 基于STL的字符串最大长度匹配算法
- 基于Bresenahams的画直线算法(J2ME版)
- 一种基于直方图模式的运动目标实时跟踪算法
- 关于快速排序和插入排序最坏时间复杂度为O(nlogn)的算法
- 基于数据库的公交换乘算法(一点思路一点问题)
- 基于WGS和CBC测序策略的DNA序列拼接算法研究(六)
- 基于临界灰度值和亚像素的“边缘寻找”算法
- 一种精确的基于DHT的p2p网络搜索算法与网络拓扑模型
- (原创)基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现)
- 基于梯度调整的矩不变自动阈值图像分割算法
- 基于WGS和CBC测序策略的DNA序列拼接算法研究(二)
- 基于WGS和CBC测序策略的DNA序列拼接算法研究(四)
- 基于WGS和CBC测序策略的DNA序列拼接算法研究 转载zhanghu1228的专栏
- 基于WGS和CBC测序策略的DNA序列拼接算法研究(五)