面试算法——寻找第K大的数(快速排序的应用)
2016-03-31 15:22
579 查看
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
测试样例:
[1,3,5,2,2],5,3
返回:2
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
测试样例:
[1,3,5,2,2],5,3
返回:2
public class 寻找第K大的数 { public static void main(String[] args) { // TODO Auto-generated method stub int[] a = { 1, 3, 5, 2, 2 }; System.out.println(findKth(a, a.length, 2)); /* * qsort(a, 0, a.length-1); for(int i:a){ System.out.print(i+" "); } */ } public static int findKth(int[] a, int n, int K) { // write code here return qs(a, 0, a.length - 1, a.length - K); } static void qsort(int[] a, int left, int right) { if (left < right) { int p = partition(a, left, right); qsort(a, left, p - 1); qsort(a, p + 1, right); } } static int qs(int[] a, int left, int right, int k) { // if (left < right) { int p = partition(a, left, right); if (p == k) { return a[p]; } else if (p > k) return qs(a, left, p - 1, k); else return qs(a, p + 1, right, k); } } static int partition(int[] a, int left, int right) { int p = a[left]; while (left < right) { while (left < right && a[right] >= p) { right--; } if (left < right) { a[left++] = a[right]; } while (left < right && a[left] <= p) { left++; } if (left < right) { a[right--] = a[left]; } } a[left] = p; return left; } }
相关文章推荐
- C#程序员经常用到的10个实用代码片段
- MySQL DBA面试全揭秘
- 职场35岁现象:各位小伙伴接近了吗?!
- android 面试题
- Android面试回忆录
- 饿了么java面试题(三轮面试亲身经历总结)
- 记阿里巴巴的一次面试
- 码农小汪-剑指Offer之23 -复杂链表的复制
- Java高级开发工程师面试考纲
- 100个iOS开发/设计面试题汇总
- 面试题72:滑动窗口的最大值
- 微软面试题:利用天平砝码,三次将140克的盐 分成50、90克两份?
- 码农小汪-剑指Offer之14 -合并两个排序的链表
- 码农小汪-剑指Offer之13 -反转链表
- Maximum Depth of Binary Tree
- 面试题71:数据流中的中位数
- 码农小汪-剑指Offer之12 -链表中倒数第k个结点
- 码农小汪-剑指Offer之11 - 调整数组顺序使奇数位于偶数前面
- 堆(heap)和栈(stack)
- 码农小汪-剑指Offer之10 - 数值的整数次方 快速幂