1.最小堆的数据结构实现
#include "iostream"
#include "vector"
using namespace std;
//最小堆
void DownHeap(vector<int>& arr,int lo,int hi){
//i应该被初始化为父节点,j为i节点的左节点
int i=lo,j=2*i+1;
//如果还存在孩子节点则一直比较并进行调整,hi为数组长度
while(j<hi){
//如果右节点存在并且值比左节点小,说明如果向上调,应该调右节点,设为最小子节点
if(j+1<hi &&arr[j]>arr[j+1]){
j++;
}
//如果最小子节点小于父节点,交换
if(arr[j]<arr[i]){
swap(arr[i],arr[j]);
//继续往下调整
i=j;
j=j*2+1;
}//如果最小子节点大于父节点,则调整结束,由于从下往上调整
else
break;
}
}
int pop(vector<int>& arr){
int len=arr.size();
int ans=arr[0];
arr[0]=arr[len-1];
arr.pop_back();
DownHeap(arr,0,len-1);
return ans;
}
void upHeap(vector<int>& arr,int lo,int hi){
//i为最后一个节点,j为i的父节点
int i=hi-1,j=(i-1)/2;
while(j>=lo){
//当父节点大于子节点,交换
if(arr[j]>arr[i]){
swap(arr[j],arr[i]);
i=j;
j=(i-1)/2;
}
else
break;
}
}
void push(vector<int>&arr,int val){
arr.push_back(val);
upHeap(arr,0,arr.size());
}
int main(){
vector<int> nums={1,2,8,9,6,4,3,5,2};
int len=nums.size();
for(int i=len/2-1;i>=0;i--){
DownHeap(nums,i,len);
}
for(int i:nums)
cout<<i<<" ";
cout<<endl;
pop(nums);
for(int i:nums)
cout<<i<<" ";
cout<<endl;
push(nums,0);
push(nums,10);
for(int i:nums)
cout<<i<<" ";
}
2.利用最大堆完成从小到大排序
#include<iostream>
#include "vector"
using namespace std;
void DownHeap(vector<int>& arr,int lo,int hi){
int i=lo,j=i*2+1;
while(j<hi){
if(j+1<hi && arr[j]<arr[j+1]){
j++;
}
if(arr[i]<arr[j]){
swap(arr[i],arr[j]);
i=j;
}
j=2*j+1;
}
}
void CreatHeap(vector<int>& arr){
int len=arr.size();
for(int i=len/2-1;i>=0;i--){
DownHeap(arr,i,len);
}
}
void Dis(vector<int>& arr){
for(int temp:arr)
cout<<temp<<" ";
cout<<endl;
}
void HeapSort(vector<int>& arr){
int len=arr.size();
CreatHeap(arr);
Dis(arr);
for(int i=len-1;i>0;i--){
swap(arr[0],arr[i]);
DownHeap(arr,0,i);
Dis(arr);
}
}
int main(){
vector<int> arr={1,2,3,1,9,8,7,5,4,2,20};
HeapSort(arr);
}
3.利用最小堆完成TOP K 算法
#include<iostream>
#include"vector"
using namespace std;
void DownHeap(vector<int>& arr,int lo,int hi){
int i=lo,j=2*i+1;
while(j<hi){
if(j+1<hi && arr[j]>arr[j+1]) j++;
if(arr[j]<arr[i]){
swap(arr[j],arr[i]);
i=j;
}
j=2*j+1;
}
}
void makeHeap(vector<int>& arr,int k){
for(int i=k/2-1;i>=0;i--){
DownHeap(arr,i,k);
}
}
void TopK(vector<int>& arr,int k){
makeHeap(arr,k);
for(int i=k;i<arr.size();i++){
if(arr[i]>arr[0]){
swap(arr[i],arr[0]);
DownHeap(arr,0,k);
}
}
}
int main(){
vector<int> arr={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
TopK(arr,10);
for(int i=0;i<10;i++)
cout<<arr[i]<<" ";
}