最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路一:堆排序,小根堆,每次找到取出最小的根
代码一:
 1     void Heap(vector<int> &arr,int len,int Root)
 2     {
 3         int index;
 4         while(1)
 5         {
 6             if(Root*2+2 < len )//有左,右孩子
 7              {
 8                  //左右孩子中大的
 9                 // printf("999\n");
10                 index = arr[Root*1+1] < arr[Root*2+2] ? Root*1+1 : Root*2+2;
11              }
12              else if(Root*1+1 < len)//只有左孩子
13             {
14                 index = Root*1+1;
15             }
16             else//没孩子
17                 break;
18             if(arr[index] < arr[Root]) //与根交换
19              {
20                  arr[index] = arr[index]^arr[Root];
21                  arr[Root] = arr[index]^arr[Root];
22                  arr[index] = arr[index]^arr[Root];
23                  Root = index;
24              }
25              else
26                 break;
27         }
28     } 
29     vector<int> GetLeastNumbers_Solution(vector<int> &input, int k) {
30         vector<int> vec;
31         int len = input.size();
32         if(k > input.size()||k==0)  return vec;
33          for(int i = len/2-1;i >=0 ;i--)
34             Heap(input,len,i);
35         
36          for(int i = len-1;i>=0;i--)
37         {
38              vec.push_back(input[0]);
39              if(vec.size() == k)
40                  break;
41             //交换
42             input[0] = input[0]^input[i];
43             input[i] = input[0]^input[i];
44             input[0] = input[0]^input[i];
45             //调整根
46             Heap(input,i,0);
47         }
48         return vec;
49     }
堆排序

 

posted @ 2018-05-31 16:38  Lune-Qiu  阅读(143)  评论(0编辑  收藏  举报