找出无序数组中最小的前k个数

来源:互联网 发布:易企秀 java 面试 编辑:程序博客网 时间:2024/05/16 10:24

基本思想:在快速排序的基础上进行改进。

时间复杂度:O(nlogn)。

具体代码如下:

package test;public class Test {public static int N = 4; //找出最小的4个数public static void QuickSort(int a[],int left,int right){int i=left;int j=right;int temp = a[i];if(left>=right)return ;while(i<j){while(i<j&&a[j]>temp)j--;if(i<j){a[i++]=a[j];}while(i<j&&a[i]<temp){i++;}if(i<j){a[j--]=a[i];}}a[j]=temp;if(i>N && left<N)  //在中轴数左边继续寻找QuickSort(a,left,i-1);if(i<=N && right>=N)  //在中轴数右边继续寻找    QuickSort(a,i+1,right);}public static void main(String[] args) {int array[] = { 1, 5, 2, 9, 4, 3, 7, 8, 6, 10 };QuickSort(array,0,N);for(int i=0;i<N;i++)System.out.print(array[i]+" ");//System.out.print(Arrays.toString(array));}}

寻找无序数组中的第K大数和前K大数,两个问题互相可以转化。如果可以找到第K大数,那么只再需要O(N)就可以找齐剩余的前K大数。如果可以找到前K大数,那么只再需要O(K)就可以找到第K大数。

先排序,在找第K个。O(NlgN)
快速排序的思想,可以做到平均效率O(N)
随机选一个元素,把所有小于等于这个元素的数移到左边,所有大于这个元素的数移动到右边。如果这个元素成了第K个数,直接返回这个数。
如果左边的个数大于K,不管右边的数了,在左边重复上面的过程。
如果左边的个数等于T<K,不管左边的数了,重复上面的过程,只是K=K-T-1。
平均情况下,第一次划分的时间复杂度是O(N),第二次是O(N/2),总共是O(N+N/2+N/4+...)=O(N)
package test;public class Test {public static int QuickSort(int a[],int left,int right,int K){int i=left;int j=right;if(K>right-left+1) return -1;if(left>right)return -1;int temp = a[i];while(i<j){while(i<j&&a[j]>temp)j--;if(i<j){a[i++]=a[j];}while(i<j&&a[i]<temp){i++;}if(i<j){a[j--]=a[i];}}a[i]=temp;int move = i-left+1;  //已经移动的步数,关键!if(move==K){return a[i];}else if(move>K){return QuickSort(a,left,i-1,K);}else{return QuickSort(a,i+1,right,K-move);}}public static void main(String[] args) {int array[] = { 1, 5, 2, 9, 4, 3, 7, 8, 6, 10 };int k = 5;System.out.println(QuickSort(array,0,9,k));}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 档案年龄多处涂改无法退休怎么办 个人办理退休原始档案丢了怎么办 在钢厂工作想辞职了怎么办呢 场地合同到期了公司不续签怎么办 应届生没毕业找到工作怎么办入职 公司工资保密同事要看工资条怎么办 考上特岗教师后和老公异地怎么办 档案在无档案保管权限的公司怎么办 辞职了户口迁回农原籍不接收怎么办 当正职直接指挥下级副职领导怎么办 单位申报个税身份证号码填错怎么办 申报个税身份证号码填错了怎么办 办了人事代理联系函商调函怎么办 劳务公司与分包工头算账成怎么办 客户退保业务员己得保险佣金怎么办 投了简历公司打来电话没接到怎么办 跟老板要工资她说过几天怎么办 公路车弯把手小抓不到刹车怎么办 新手骑电动车上路车子一直晃怎么办 不知情收赃东西已经卖了怎么办 档案和派遣证不在同一个地方怎么办 档案缺招工表和派遣证怎么办退休 开发商对接的银行利息比较高怎么办 工作未满一年离职转正定级怎么办 被网络骗贷翻到几十万怎么办 面试通过后迟迟不通知入职怎么办 厂里捡到饭卡花了里面的钱怎么办 上班用自己手机打卡没电怎么办 逸尚考勤机显示超出考勤记录怎么办 下雨穿套裙工装上班好冷怎么办 蚂蚁借呗放款中不到账怎么办 护士电子化注册没有激活码怎么办? 地铁站务员入职体检身高差点怎么办 车子钥匙锁在车里了怎么办 打错账户了怎么办5天了 下岗失业人员在就业后档案怎么办 皮秒祛斑后没有敷面膜怎么办 硕士毕业工资好低不想工作怎么办 车卖了etc忘拿了怎么办 成熟卵泡打破卵针也不破怎么办? 深圳孩子户口挂别人名下上学怎么办