ヒープ関連の注意事項
リファレンス注:概要劉手に負えない首長https://www.liuchuo.net/archives/2277
二次の理由の概要
第二は、それが必要であるかどうかをまとめたものについては、私は、内在化プロセスは、プロセスの概要である、参照は他の人の知識を学ぶために、それがあると思います。毎回同じ人の思考参照軌道は本当に思考を養うことができます。記事のノート仕上げ理由:ヒープパスタイトルのPAT高度なレベルでは、正シーケンストラバーサルのヒープ上の画像を参照してください。そして、見た目のヒープ関連のメモを取ります。
第二に、(例えば大きな根ヒープ用)主ヒープデータ構造アルゴリズム
- ヒープの作成
void createHeap(){
for(int i=n/2;i>=1;i--)
downAjust(i,n);
}
- 下方修正:アイデアは、子供、リミットの高い代表の低い代わっです。私たちは、調整[ハイ、ロー]の範囲、1 +低・低2人の*低い子供であるとします。何のやり取りがない場合、それは彼の父は、比較するために交換しても上に、抜け出すだろう。
void downAdjust(int low,int high){
int i=low,j=i*2;//i为要调整的节点,j为左孩子
while(j<=high){
if(j+1<=high && heap[j+1]>heap[j]) j=j+1;
if(heap[j]>heap[i]){
swap(heap[j],heap[i]);
i=j;j=i*2;
}else break;
}
}
- ヒープ要素の上部を削除します
void deleteTop(){
heap[1]=heap[n--];//用第n个数进行覆盖
downAdjust(1,n);//之后进行向下调整第一个数
}
- 要素を追加します。
void insert(int x){
heap[++n]=x;
upAdjust(1,n);
}
- 上方修正
void upAdjust(int low,int high){
int i=high,j=i/2;
while(j>=low){
if(heap[j]<heap[i]){
swap(heap[j],heap[i]);
i=j;j=i/2;
}else break;
}
}
- ヒープソート
下方調節のための第1の上部交換素子の数及び範囲、(1、I-1)は、i == 2まで
void heapSort(){
createHeap();
for(int i=n;i>=2;i--){
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}
ヒープソート時間の複雑さ:O(nlogn)スペースの複雑さ(1)Oが不安定な安定性であります
第三に、手書きheap.hヘッダファイル
#ifndef HEAP_H_INCLUDED
#define HEAP_H_INCLUDED
#define maxn 1000
using namespace std;//这里面有swap函数
int heap[maxn];
void upAdjust(int low,int high){
int i=high,j=i/2;
while(j>=low){
if(heap[j]<heap[i]){
swap(heap[j],heap[i]);
i=j;j=i/2;
}else break;
}
}
void downAdjust(int low,int high){
int i=low,j=i*2;//i为要调整的节点,j为左孩子
while(j<=high){
if(j+1<=high && heap[j+1]>heap[j]) j=j+1;
if(heap[j]>heap[i]){
swap(heap[j],heap[i]);
i=j;j=i*2;
}else break;
}
}
void createHeap(int n){
for(int i=n/2;i>=1;i--)
downAdjust(i,n);
}
void deleteTop(int n){
heap[1]=heap[n--];//用第n个数进行覆盖
downAdjust(1,n);//之后进行向下调整第一个数
}
void insert(int x,int n){
heap[++n]=x;
upAdjust(1,n);
}
void heapSort(int n){
createHeap(n);
for(int i=n;i>=2;i--){
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}
#endif // HEAP_H_INCLUDED
第四に、テストファイル
#include <iostream>
#include "heap.h"
using namespace std;
int main(){
extern int heap[maxn];
extern int n;
scanf("%d",&n);
/**我们的堆序列是从[1,n]的*/
for(int i=1;i<=n;i++) scanf("%d",&heap[i]);
createHeap();//生成大根堆
insert(4);//插入堆顶元素
deleteTop();//删除堆顶
heapSort();//排序
for(int i=1;i<=n;i++) printf("%d%s",heap[i],i==n?"\n":" ");
system("pause");
return 0;
}