スタックデータ構造(並べ替え、削除、挿入、作成)

ヒープ関連の注意事項

リファレンス注:概要劉手に負えない首長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;
}

おすすめ

転載: www.cnblogs.com/littlepage/p/11617612.html