剑指Offer第二十题:最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

题目分析

这个题是赤裸裸的排序,话不多说,排序方式很多,这个题我使用的是快速排序。

快速排序:将数组的第一个数值作为标记位,然后分别从前往后寻找到大于标记位的位置i,和从后往前寻找到小于标记位的位置j,然后交换i,j的数据位置,再把i位置的数据和标记位的数据交换,然后该数组就分成了左边和右边两部分,分别操作就可以了。快速排序最坏的情况下是O(N^2),平均是O(NlogN)。

源代码

 

 1 /*    输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。*/
 2     public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
 3         quicksort(input,0,input.length-1);
 4         ArrayList<Integer> arrayList=new ArrayList<>();
 5         if(k>input.length)
 6             return arrayList;
 7         
 8         for(int i=0;i<k;i++) {
 9             arrayList.add(input[i]);
10         }
11         return arrayList;
12     }
13     
14     public void quicksort(int []array,int start,int end) {//快速排序
15         if(start>end)
16             return;
17         int temp=array[start];//标记位,全程将使用这个比较
18         int i=start;
19         int j=end;
20         while(i!=j) {
21             while(array[j]>=temp&&i<j)
22                 j--;
23             while(array[i]<=temp&&i<j)
24                 i++;
25             if(i<j) {
26                 int t=array[i];
27                 array[i]=array[j];
28                 array[j]=t;
29             }
30         }
31         array[start]=array[i];
32         array[i]=temp;
33         quicksort(array, start, i-1);
34         quicksort(array, i+1, end);
35         
36     }

 

posted @ 2018-09-08 17:02  轻抚丶两袖风尘  阅读(96)  评论(0编辑  收藏  举报