当前位置:网站首页>Manually implement heap sorting -838 Heap sort
Manually implement heap sorting -838 Heap sort
2022-07-05 04:41:00 【The wind is a little strong】
Heap properties
Pile up (Heap) Is a kind of data structure , They have a tree structure , And it can ensure that the parent node is larger than the child node ( Or small ). When the root node saves the maximum value in the heap , be called Big root pile ; conversely , It is called a Heap .
Binary heap (Binary Heap) It's the simplest 、 Common heap , It is a tree that conforms to the nature of heap Perfect binary tree . It can achieve O(logn) Insert or delete a value , also O(1) Query the largest ( Or the smallest ) value .
Storage
Take the small root pile for example
As a complete binary tree , A binary stack can be used 1-index To store , For the node p,p2 That is, the left son ,p2+1 That is, the right node . meanwhile , use size Record the number of nodes in the current binary heap .
The relevant operation
up(int x): Compare with the root node of the current node , If the current point is smaller than the root node , Exchange with the root node
down(int x): Compare with the left and right sons of the current node , If the left and right sons are a little smaller than the current , Then exchange the younger son with the current point
Templates
// h[N] Store values in the heap , h[1] It's the top of the pile ,x My left son is 2x, The right son is 2x + 1
// ph[k] Store the k The position of an insertion point in the heap
// hp[k] The subscript in the heap is k Which point is inserted
int h[N], ph[N], hp[N], size;
// Swap two points , And its mapping relationship
void heap_swap(int a, int b)
{
swap(ph[hp[a]],ph[hp[b]]);
swap(hp[a], hp[b]);
swap(h[a], h[b]);
}
void down(int u)
{
int t = u;
if (u * 2 <= size && h[u * 2] < h[t]) t = u * 2;
if (u * 2 + 1 <= size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
if (u != t)
{
heap_swap(u, t);
down(t);
}
}
void up(int u)
{
while (u / 2 && h[u] < h[u / 2])
{
heap_swap(u, u / 2);
u >>= 1;
}
}
// O(n) Building the heap
for (int i = n / 2; i; i -- ) down(i);
subject
Code
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100005;
int h[N],len;
int n,m;
void down(int u){
int t=u; //t Save the subscript of the lowest decimal
if(2*u<=len && h[2*u]<h[t]){
// Subscript to be u My point has a left son , The left son is smaller
t=2*u; // The youngest is the left son
}
if(2*u+1<=len && h[2*u+1]<h[t]){
// Subscript to be u The right son of is smaller than the current youngest
t=2*u+1; // The youngest is the right son
}
if(u!=t){
// If the current value is not the minimum , So update
swap(h[u],h[t]); // Exchange the smallest to u The location of
down(t); // Recursive current (2u+1) The following values
}
}
void up(int u){
if(u/2>=1 && h[u/2]>h[u]){
// There is a parent node ,
swap(h[u/2],h[u]);
up(u/2);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>h[i];
}
len=n;
for(int i=n/2;i>0;i--){
// Because the last layer has no child nodes , So just cycle n/2 That's it .
down(i);
}
while(m--){
cout<<h[1]<<" ";
h[1]=h[len]; // After taking out the minimum value , Put the last value in the first position , Total number minus one , then down
len--;
down(1);
}
return 0;
}
Reference resources Algorithm learning notes (47): Binary heap
边栏推荐
- Construction d'un Cluster redis sous Windows
- Scope of package class package
- Pointer function (basic)
- All in one 1413: determine base
- windows下Redis-cluster集群搭建
- Wan broadband access technology V EPON Technology
- Solution of circular dependency
- Components in protective circuit
- [thingsboard] how to replace the homepage logo
- Group counting notes (1) - check code, original complement multiplication and division calculation, floating point calculation
猜你喜欢
2022-2028 global and Chinese equipment as a Service Market Research Report
Cookie learning diary 1
WeNet:面向工业落地的E2E语音识别工具
mxnet导入报各种libcudart*.so、 libcuda*.so找不到
MySQL in-depth learning - index creation and deletion, index design principles, index failure scenarios, query optimization, index push down ICP
[phantom engine UE] the difference between running and starting, and the analysis of common problems
49 pictures and 26 questions explain in detail what is WiFi?
[uniapp] system hot update implementation ideas
防护电路中的元器件
Sword finger offer 04 Search in two-dimensional array
随机推荐
10 programming habits that web developers should develop
TPG x AIDU|AI领军人才招募计划进行中!
C26451: arithmetic overflow: use the operator * on a 4-byte value, and then convert the result to an 8-byte value. To avoid overflow, cast the value to wide type before calling the operator * (io.2)
2022-2028 global and Chinese video coding and transcoding Market Research Report
MacBook installation postgresql+postgis
How to get the first few pieces of data of each group gracefully
TPG x AIDU | AI leading talent recruitment plan in progress!
首席信息官如何利用业务分析构建业务价值?
This is an age of uncertainty
All in one 1413: determine base
Download the details and sequence of the original data access from the ENA database in EBI
Wenet: E2E speech recognition tool for industrial implementation
托管式服务网络:云原生时代的应用体系架构进化
Machine learning decision tree
Chapter 6 text processing tools for shell programming (awk)
Special information | real estate and office buildings - 22.1.9
Aperçu en direct | Services de conteneurs ACK flexible Prediction Best Practices
Reading and visualization of DICOM, MHD and raw files in medical imaging
解密函数计算异步任务能力之「任务的状态及生命周期管理」
Function overloading