码迷,mamicode.com
首页 > 编程语言 > 详细

找到无序数组中最小的k个数

时间:2016-08-14 23:48:24      阅读:473      评论:0      收藏:0      [点我收藏+]

标签:

题目:给定一个无序整数数组arr,找到其中最小的k个数

要求:如果数组arr的长度为n,排序之后自然可以得到最小的k个数,此时时间复杂度与排序的时间复杂度相同均为O(NlogN),本题要求实现时间复杂度为O(NLogK).

1.O(NLogK)的方法,即一直维护一个有k个数的最大的大根堆,这个堆是目前选出的k个最小数,在堆里的k个元素中堆顶的元素是最大的一个。

接下来遍历整个数组,遍历的过程中看当前数是否比堆顶元素小。如果是,就把堆顶的元素替换成当前的数,然后从堆顶的位置调整堆,替换后堆的最大元素的位置依旧在堆顶;如果不是,则不进行任何操作,继续遍历下一个数;遍历完成后,堆中的k个数就是所有数组中最小的k个数。

具体请参看如下代码中的getMinKNumsByHeap方法,代码中的heapInsert和heapify方法分别为堆排序中的建堆和调整堆的实现。

技术分享
 1 public int[]  getMinKNumsByHeap(int[] arr,int k)
 2 {
 3     if(k<1 || k>arr.length)
 4             return arr;
 5     int[] kHeap=new int[k];
 6     for(int i=0;i<k;i++)
 7     {
 8         heapInsert(kHeap,arr[i],i);
 9      }
10    for(int i=k;i<arr.length;i++)
11   {
12        if(arr[i]<kHeap[0])
13      {
14           kHeap[0]=arr[i];
15          heapify(kHeap,0,k);
16      }
17    }
18   return kHeap;
19 }
20 
21 public void heapInsert(int[] arr,int value,int index)
22 {
23    arr[index]=value;
24    while(index!=0)
25   {
26     int parent=(index-1)/2;
27     if(arr[parent]<arr[index])
28     {
29        swap(arr,parent,index);
30        index=parent;
31     }
32   else
33      break;
34   }
35 }
36 
37 public void  heapify(int[] arr,int index,int heapSize)
38 {
39     int left=index*2+1;
40     int right=index*2+2;
41     int largest=index;
42    while(left<heapSize)
43  {
44      if(arr[left]>arr[index])
45              largest=left;
46      if(right<heapSize&&arr[right]>arr[largest])
47               largest=right;
48      if(largest!=index)
49               swap(arr,largest,index);
50       else
51         break;
52     index=largest;
53     left=index*2+1;
54     right=index*2+2;
55     }
56 }
57 
58 public void swap(int[] arr,int index1,int index2)
59 {
60     int tmp=arr[index1];
61     arr[index1]=arr[index2];
62     arr[index2]=tmp;
63 }
View Code

 

找到无序数组中最小的k个数

标签:

原文地址:http://www.cnblogs.com/guanling222/p/5771180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!