找第K小个数
来源:互联网 发布:360软件强力卸载 编辑:程序博客网 时间:2024/04/30 19:07
快排进行划分:
import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Solution {public static void main(String[] args){int[] nums = {2,4,3,6,1,5};Solution s = new Solution();int k = 3;int res = s.findkminNum(k,0,5,nums);System.out.println(res);} public int findkminNum(int k,int start,int end,int[] nums){ if(k==0||k>end-start+1||end<start) return -1; int key = nums[end]; int i = start-1; for(int j=start;j<end;j++){ if(nums[j]<key){ i++; int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } } i++;int tmp = nums[i];nums[i] = nums[end];nums[end] = tmp; int partition = i; if(partition-start+1==k) return nums[partition]; else if(partition-start+1>k) return findkminNum(k,start,partition-1,nums); else return findkminNum(k-(partition-start+1),partition+1,end,nums); }}
讲解得比较详细的博客: http://www.yalewoo.com/quickselect_and_linearselect.html
下面这种方法思路"巧妙"?个人觉得很不够直观,编程到一半比较懒,暂且记录下来,挖个坑
import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Solution {public static void main(String[] args){int[] nums = {2,4,3,6,1,5};Solution s = new Solution();int k = 3;int res = s.findkminNum(k,nums);System.out.println(res);} public int findkminNum(int k, int[] nums){ int n = nums.length; int sub = n/5; for(int i=0;i<sub;i++){ int[] elem = new int[5]; for(int j=0;j<5;j++){ if(5*i+j<n)elem[j]=nums[5*i+j]; /* * insert sort --- start */ int pos = j; int tmp = nums[pos]; while(j>0&&elem[j-1]>elem[pos]){ j--; } for(int h=pos;h>j;h--){ elem[h]=elem[h-1]; } elem[j] = tmp; /* * insert sort --- end */ } for(int j=0;j<5;j++){ if(5*i+j<n) nums[5*i+j] = elem[j]; } } int[] mediumArray = new int[sub]; for(int i=0;i<sub-1;i++){ mediumArray[i] = nums[5*i+2]; } if(n%5>=3||n%5==0) mediumArray[sub-1] = nums[5*(sub-1)+2]; if(n%5<3||n%5!=0) mediumArray[sub-1] = nums[n-1]; int partition = findkminNum((sub+1)/2,mediumArray); int countSmaller = 3*((sub+1)/2); int countBigger = 3*(n-(sub+1)/2); int partition2 if(k==partition) return k; }}
0 0
- 找第K小个数
- 查找第k小个数
- 算法导论--在无序数组中选择第k小个数
- 找第k大的数
- 【模拟】找第k小的数
- 找第K大的数
- 找第K个最小数
- 找第K大的数
- 找第k大的数
- 找第k小的数
- 「小顶/大顶堆」找第k大数,找第k小丑数, 找杨氏矩阵第k小数
- java快排,找第K小的数,找前K个数
- 两个有序数组找第k小的数
- 找数组中第k大的数
- 线性时间找第K小的数
- 两个有序数组找第k大的数
- 找一个数组中第K大的数
- 快排查找第K小的数
- JS判断鼠标单双击事件
- C++关键字(2)
- am 命令使用
- AES 加解密
- android-微信个人公众号
- 找第K小个数
- hadoop2.5.x完全分布式集群搭建配置
- 设计模式简介
- 简单的<c:forEach>应用
- Keil逻辑分析仪的使用
- Android开发圆形头像,RoundedImageView
- HM编码器代码阅读(37)——帧内预测(四)帧内预测之候选模式列表的建立
- 好友csgo被血虐
- 元件(Component)