堆排序中求前K个最小数

本文详细介绍了堆排序算法的基本原理,包括构建堆和调整堆的过程,并通过实例展示了如何使用堆排序进行数据排序,同时对算法进行了优化以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01.#include "iostream"  
02.#include "vector"  
03.#include "algorithm"  
04.using namespace std;  
05.void HeapAdjust(std::vector<int> &a,int i,int size){ 
06.    int lchild = 2*i + 1; 
07.    int rchild = 2*i + 2; 
 08.    int max = i;  
09.    if(i < size/2 ){
10.        if(lchild<size&&a[lchild]>a[max]) max = lchild; 
 11.        if(lchild<size&&a[rchild]>a[max]) max = rchild; 
12.        if(max != i){  
13.            swap(a[i],a[max]);  
14.            HeapAdjust(a,max,size);  
15.        }  
16.    }  
17.}  
18.void BuildHeap(std::vector<int> &a,int k){  
19.    for (int i = k-1; i >= 0; --i)  
20.    {  
21.        HeapAdjust(a,i,k);  
22.    }  
23.}  
24.int main(int argc, char const *argv[])  
25.{  
26.    std::vector<int> a(6);  
27.    a[0] = 3;a[1] = 11; a[2] = 8;a[3] = 2;  
28.    a[4] = 9;a[5] = 4;  
29.    int k = 3;//取前k最小的  
30.    BuildHeap(a,k);  
31.    for (int i = k; i < a.size(); ++i)  
32.    {  
33.        if(a[0] > a[i]) {  
34.            swap(a[0],a[i]);  
35.            HeapAdjust(a,0,k);  
36.        }  
37.    }  
38.    for (int i = 0; i < k; ++i)  
39.    {  
40.        cout<<a[i]<<"\t";  
41.    }  
42.    return 0;  
43.}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值