最小的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     }
堆排序

 

转载于:https://www.cnblogs.com/Lune-Qiu/p/9117485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值