堆是具有下列性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆,如左圖;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆,如右圖。
堆排序(heap sort)就是利用堆(假設利用大頂堆)進行排序的方法。它的基本思想是,將帶排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構造成乙個堆,這樣就會得到n個元素中的次小值。如此反覆執行,便得到乙個有序序列了。
#include "stdafx.h"
using namespace std;
#include#include"stdafx.h"
//用於要排序陣列個數最大值,可根據需要修改
#define maxsize 10
typedef struct
sqlist;
//交換l中陣列r的下標為i和j的值
void swap(sqlist *l, int i, int j)
/* 已知l->r[s..m]中記錄的關鍵字除l->r[s]之外均滿足堆的定義, */
/* 本函式調整l->r[s]的關鍵字,使l->r[s..m]成為乙個大頂堆 */
void heapadjust(sqlist *l, int s, int m)
l->r[s] = temp; /* 插入 */
}/* 對順序表l進行堆排序 */
堆排序的時間複雜度為:o(nlogn)。
由於初始構建堆所需的比較次數較多,因此,它不適合待排序序列個數較小的情況。
不穩定
演算法與資料結構 六 堆排序
上一次說到了3種基本的排序演算法,三種基本的排序演算法時間複雜度都是o n 2 雖然比較簡單,但是效率相對較差,因此後續有許多相應的改進演算法,這次主要說說堆排序演算法。堆排序演算法是對選擇排序的一種優化。那麼什麼是堆呢?堆是一種樹形結構。在維基百科上的定義是這樣的 給定堆中任意節點 p 和 c,若...
堆(資料結構)及堆排序
這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...
資料結構 堆以及堆排序
堆可以看作是一棵完全二叉樹,除最後一層外,每一層都是填滿的,最後一層從左到右依次填入 在堆上,對任意乙個結點來說,越接近頂部,權值就越大 一般指大頂堆 並且它的權值大於等於它所在子樹所有點的權值 我們把根結點權值大於等於樹中結點權值的稱為大根堆,小於等於樹種結點權值的稱為小根堆 下圖就是乙個大根堆的...