zoukankan      html  css  js  c++  java
  • 寻找最小的k个数

    public class FindKMin{
        int[] nums=new int[1000];
        int k=10;
    //方法一,先排序,查找前k个
    public void sortAndFind(){ int[] arr=Arrays.copyOf(nums, nums.length); Arrays.sort(arr); System.out.println(Arrays.toString(Arrays.copyOfRange(arr, 0, k))); } //方法二,利用选择排序的思想,更新含当前最小k个数的数组 private int findMax(int[] arr){ int max=Integer.MIN_VALUE; int index=-1; for(int i=0;i<arr.length;i++){ if(max<arr[i]){ max=arr[i]; index=i; } } return index; } public void selectAndSwap(){ int[] arr=Arrays.copyOfRange(nums, 0, k); for(int i=k;i<nums.length;i++){ int j=findMax(arr); if(arr[j]>nums[i]){ arr[j]=nums[i]; } } Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }
    //方法三,利用大顶堆,来更新含当前最小k个数的数组
    public void HeapAndFind(){ int[] arr=new int[k+1]; arr[0]=Integer.MAX_VALUE; for(int i=1;i<k+1;i++){ arr[i]=nums[i-1]; } for(int i=k/2;i>=1;i--){ sink(arr,i,k); } for(int i=k;i<nums.length;i++){ if(arr[1]>nums[i]){ arr[1]=nums[i]; sink(arr,1,k); } } int N=k; while(N>1){ swap(arr,1,N--); sink(arr,1,N); } int[] res=Arrays.copyOfRange(arr, 1,k+1); System.out.println(Arrays.toString(res)); } private void sink(int[] arr, int i, int N) { while(2*i<=N){ int j=2*i; if(j<N&&arr[j]<arr[j+1]) j++; if(arr[i]>=arr[j]) break; swap(arr,i,j); i=j; } } private void swap(int[] arr,int i,int j){ int tmp=arr[i]; arr[i]=arr[j]; arr[j]=tmp; }

    //方法四,快速排序
    public void quickSortAndFind(){
            int[] arr=Arrays.copyOf(nums, nums.length);
            int K=k;
            sort(arr,0,arr.length-1);
            int[] res=Arrays.copyOfRange(arr, 0, K);
            Arrays.sort(res);
            System.out.println(Arrays.toString(res));
        }
        
        private void sort(int[] arr, int lo, int hi) {
            if(hi<=lo) return;
            int j=partition(arr,lo,hi);
            if(j-lo+1>=k){
                sort(arr,lo,j-1);
            }else{
                k=k-(j-lo+1);
                sort(arr,j+1,hi);
            }
            
        }
    
        private int partition(int[] arr, int lo, int hi) {
            int i=lo;
            int j=hi+1;
            int v=arr[lo];
            while(true){
                while(arr[++i]<v&&i<hi);
                while(v<arr[--j]&&j>lo);
                if(i>=j) break;
                swap(arr,i,j);
            }
            swap(arr,lo,j);
            return j;
        }
    
    
    
    
        @Test
        public void test(){
            Random random=new Random();
            k=10;
            for(int i=0;i<nums.length;i++){
                nums[i]=random.nextInt(10000);
            }
            sortAndFind();
            selectAndSwap();
            HeapAndFind();
        }
    }
  • 相关阅读:
    Linux Centos7配置mysql8.0数据库
    Linux Centos7配置ftp服务器
    线程池工具ThreadPoolExecutor
    Layui 实现input 输入和选择
    canvas验证码实现
    弹性布局flex 介绍
    java EE 新手入门了解
    java web工程web.xml介绍
    js 数组常用的一些方法
    详解为什么需要重写hashcode 和 equals 方法
  • 原文地址:https://www.cnblogs.com/wqkant/p/6856419.html
Copyright © 2011-2022 走看看