C++最小堆的数据结构(插入删除)+使用最大堆进行堆排序

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]<<" ";
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值