当前位置:网站首页>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
边栏推荐
- [AI bulletin 20220211] the hard core up owner has built a lidar and detailed AI accelerator
- Scope of package class package
- Private collection project practice sharing [Yugong series] February 2022 U3D full stack class 006 unity toolbar
- Setting up redis cluster cluster under Windows
- Hexadecimal to octal
- Flutter tips: various fancy nesting of listview and pageview
- Special information | finance, accounting, audit - 22.1.23
- 2022-2028 global and Chinese FPGA prototype system Market Research Report
- How can CIOs use business analysis to build business value?
- 防护电路中的元器件
猜你喜欢
Observable time series data downsampling practice in Prometheus
首席信息官如何利用业务分析构建业务价值?
How to get the first few pieces of data of each group gracefully
Cookie learning diary 1
可观测|时序数据降采样在Prometheus实践复盘
Reading and visualization of DICOM, MHD and raw files in medical imaging
取余操作是一个哈希函数
Discussion on the dimension of confrontation subspace
Special information | real estate and office buildings - 22.1.9
线上故障突突突?如何紧急诊断、排查与恢复
随机推荐
[goweb development] Introduction to authentication modes based on cookies, sessions and JWT tokens
49 pictures and 26 questions explain in detail what is WiFi?
Web开发人员应该养成的10个编程习惯
Rk3399 platform development series explanation (network debugging) 7.29 summary of network performance tools
TPG x AIDU|AI领军人才招募计划进行中!
Stage experience
Mxnet imports various libcudarts * so、 libcuda*. So not found
程序员应该怎么学数学
2022-2028 global and Chinese virtual data storage Market Research Report
MacBook installation postgresql+postgis
American 5g open ran suffered another major setback, and its attempt to counter China's 5g technology has failed
首席信息官如何利用业务分析构建业务价值?
Aperçu en direct | Services de conteneurs ACK flexible Prediction Best Practices
[crampon programming] lintcode decoding Encyclopedia - 1100 strange printer
Introduce Hamming distance and calculation examples
[uniapp] system hot update implementation ideas
PHP读取ini文件并修改内容写入
How should programmers learn mathematics
JVM 原理和流程简介
English topic assignment (26)