最小的k个数

来源:互联网 发布:苹果mac终端怎么进入 编辑:程序博客网 时间:2024/06/05 18:57

题目:给定一个数组,请找出数组中最小的k个数。

分析:可以使用快速排序算法中的一部分加以改造利用。如果基于数组的第k个数来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数大的数字都位于数组的右边。这样调整之后,位于数组中左边的k个数字就是最小的k个数(不一定有序)

代码如下:

import java.util.Set;import java.util.TreeSet;/** * @author Hutongling * * @time:2017年3月24日 上午9:16:19 */public class 最小的k个数 {    public  static Integer[] leastNum(int[] data,int k){        if(data==null ||k<=0)            return null;        else{            Integer outPut[]=new Integer[k];            int start=0;            int end=data.length-1;            int index=partition(data,start,end);            while(index!=k-1){                if(index>k-1){                    end=index-1;                    index=partition(data,start,end);                }                else{                    start=index+1;                    index=partition(data,start,end);                }            }            for(int i=0;i<k;i++){                outPut[i]=data[i];            }            return outPut;        }    }    private static int partition(int[] data, int low, int high) {        int temp=data[low];        while(low<high){            while(data[high]>=temp && low<high)                high--;            data[low]=data[high];            while(data[low]<=temp && low<high)                low++;            data[high]=data[low];        }        data[low]=temp;        return low;    }    public static void main(String[] args) {        int data[]={4,5,1,6,2,7,3,8,9,18,10,19,12};        for(int i=0;i<leastNum(data,3).length;i++)            System.out.print(leastNum(data,3)[i] + " ");    }}

结果如下:
1 2 3

0 0
原创粉丝点击