求第k小的元素
用快排解决:
用快排,一趟排序后,根据基准值来缩小问题规模。基准值的下角标i 加1 表示了基准值在数组中第几小。如果k<i+1,那就在左半边找;如果k>i+1那就在右半边找。当基准值的下角标+1=k,那就找到答案了。
public class FindTopKth {
    private FindTopKth() {}
    /**
     * @param arr   待查找的数组
     * @param left  待查找数组的左边界
     * @param right 待查找数组的右边界
     * @param k     查找第k小的元素
     * @param <T>   泛型
     * @return 返回第k小的元素
     */
    public static <T extends Comparable<? super T>> T find(T[] arr, int left, int right, int k) {
        int p = partition(arr, left, right, k);
        if (p == k) {
            return arr[p];
        } else if (k < p) {
            return find(arr, left, p - 1, k);
        } else {
            return find(arr, p + 1, right, k);
        }
    }
    private static <T extends Comparable<? super T>> int partition(T[] arr, int left, int right, int k) {
        T base = arr[left];
        int j = left;
        for (int i = left+1; i <= right; i++) {
            if (arr[i].compareTo(base) < 0) {
                swap(arr, i, ++j);
            }
        }
        swap(arr, left, j);
        return j;
    }
    private static void swap(Object[] arr, int i, int j) {
        if (i != j) {
            Object temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    public static <T extends Comparable<? super T>> T find(T[] arr, int k) {
        return find(arr,0,arr.length-1,k-1);
    }
    public static void main(String[] args) {
        Integer[] arr = {3, 1, 9, 7, 5, 11};
        System.out.println(find(arr,1));//第1小的 //1
        System.out.println(find(arr,2));//第2小的 //3
        System.out.println(find(arr,3));//第3小的 //5
        System.out.println(find(arr,4));//第4小的 //7
        System.out.println(find(arr,5));//第5小的 //9
        System.out.println(find(arr,6));//第6小的 //11
    }
}
求第k小的元素的更多相关文章
- 树状数组求第k小的元素
		int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ... 
- 求第 k 小:大元素
		#include<bits/stdc++.h> using namespace std; void swap_t(int a[],int i,int j) { int t=a[i]; a[ ... 
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
		对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ... 
- ch1_5_2求无序序列中第k小的元素
		import java.util.Arrays; import java.util.PriorityQueue; public class ch1_5_2求无序序列中第k小的元素 { public s ... 
- [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
		Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ... 
- [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素
		Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ... 
- 利用快排partition求前N小的元素
		求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ... 
- 算法导论-顺序统计-快速求第i小的元素
		目录 1.问题的引出-求第i个顺序统计量 2.方法一:以期望线性时间做选择 3.方法二(改进):最坏情况线性时间的选择 4.完整测试代码(c++) 5.参考资料 内容 1.问题的引出-求第i个顺序统计 ... 
- [LeetCode] 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
		Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ... 
随机推荐
- OpenStack中memcached的使用和实现
			概述 主要分享下个人对Liberty版本openstack中cache使用的理解,由于作者水平有限,难免有所错误,疏漏,还望批评指正. openstack中可以使用cache层来缓存数据,Libert ... 
- B树、B-树、B+树、B*树【转】,mysql索引
			B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ... 
- 我的Java设计模式-责任链模式
			今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ... 
- Android开发之Android Context Menu
			1 Creatinga上下文菜单, Todefine上下文菜单的外观和行为,推翻youractivity的上下文菜单回滚方法,onCreateContextMenu()和onContextItemSe ... 
- 【前端】Angular2 Ionic2 学习记录
			转载请注明出处:http://www.cnblogs.com/shamoyuu/p/angular2_ionic2.html 一.建立项目 ionic start ProductName super ... 
- java程序调用xfire发布的webService服务
			昨天用xfire搭好了一个简单的webService的服务,可以在浏览器访问,今天便想要尝试以下如何调用这个服务及相关的方法.在网上查找了一些资料后,实现过程如下. 1.创建一个maven web项目 ... 
- dojo报错总结
			dojo报错总结 1.错误一 neteaseTracker is not defined dojo.js(第15行) 2.错误二 _10 is undefined _SearchMixin.js(第5 ... 
- memcache 查看memcache的运行状态
			memcache的运行状态可以方便的用 stats 命令显示. 首先用telnet 127.0.0.1 11211这样的命令连接上memcache,然后直接输入stats就可以得到当前memcache ... 
- 一个完整的springmvc + ajaxfileupload实现图片异步上传的案例
			一,原理 详细原理请看这篇文章 springmvc + ajaxfileupload解决ajax不能异步上传图片的问题.java.lang.ClassCastException: org.apache ... 
- n人围成一圈报数
			题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位 思路:用一个数组存这n个人,里面的初始状态全设为1,表示都还在圈子里面. ... 
