內部排序之堆排序

2021-05-27 05:24:09 字數 2181 閱讀 6517

堆排序(heap sort)只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。

(1)基本概念

a)堆:設有n個元素的序列:

對所有的i=1,2,...,(int)(n/2),當滿足下面關係:

ki≤k2i,ki≤k2i+1

或            ki≥k2i,ki≥k2i+1

這樣的序列稱為堆。

堆的兩種型別:

根結點最小的堆----小根堆。

根結點最大的堆----大根堆。

根結點稱為堆頂,即:在一棵完全二叉樹中,所有非葉結點的值均小於(或均大於)左、右孩子的值。

b)堆排序:是一種樹型選擇排序,特點是,在排序過程中,把r[1..n]看成是乙個完全二叉樹的儲存結構,利用完全二叉樹雙親結點和孩子結點的內在關係,在當前無序區中選擇關鍵字最大(最小)的記錄。

(2)堆排序步驟:

1、從k-1層的最右非葉結點開始,使關鍵字值大(或小)的記錄逐步向二叉樹的上層移動,最大(或小)關鍵字記錄成為樹的根結點,使其成為堆。

2、逐步輸出根結點,令r[1]=r[i](i=n,,n-1,...,2),在將剩餘結點調整成堆。直到輸出所有結點。我們稱這個自堆頂到葉子的調整過程為「篩選」。

(3)要解決的兩個問題:

1、如何由乙個無序序列建成乙個堆;

2、輸出乙個根結點後,如何將剩餘元素調整成乙個堆。

將乙個無序序列建成乙個堆是乙個反覆「篩選」的過程。若將此序列看成是乙個完全二叉樹,則最後乙個非終端結點是第floor(n/2)個元素,由此「篩選」只需從第floor(n/2)個元素開始。

堆排序中需乙個記錄大小的輔助空間,每個待排的記錄僅占有乙個儲存空間。堆排序方法當記錄較少時,不值得提倡。當n很大時,效率很高。堆排序是不穩定的。

堆排序的演算法和篩選的演算法如第二節所示。為使排序結果是非遞減有序排列,我們在排序演算法中先建乙個「大頂堆」,即先選得乙個關鍵字為最大的記錄並與序列中最後乙個記錄交換,然後對序列中前n-1個記錄進行篩選,重新將它調整為乙個「大頂堆」,然後將選得的乙個關鍵字為最大的記錄(也就是第乙個元素)與當前最後乙個記錄交換(全域性看是第n-1個),如此往復,直到排序結束。由到,篩選應按關鍵字較大的孩子結點向下進行。

堆排序的演算法描述如下:

用c語言**實現如下:

#include "iostream"

using namespace std;

#define maxsize 20

typedef struct

redtype;

typedef struct

sqlist;

typedef sqlist heaptype; //堆採用順序表儲存表示

void heapadjust(heaptype &h,int s,int m) //已知h.r[s...m]中記錄的關鍵字出h.r[s].key之外均滿足堆的定義,本函式調整h.r[s]的關鍵字,使h.r[s...m]成為乙個大頂堆(對其中記錄的關鍵字而言)

h.r[s]=rc; //插入

}void heapsort(heaptype &h) //對順序表h進行堆排序

}//heapsort

void inputl(sqlist &l)

void outputl(sqlist &l)

int main(void)

不使用上面的結構體的另外一種方法如下:

/*

*堆排序

*/#include "iostream"

using namespace std;

#define n 10

int array[n];

void man_input(int *array)

}void myswap(int *a,int *b)//交換

void heap_adjust(int *heap,int root,int len) //對堆進行調整,使下標從root到len的無序序列成為乙個大頂堆

heap[i/2]=t;

}void heapsort(int *heap,int len) //堆排序

for(i=len;i>=1;i--) }

void print_array(int *array,int n)

{ int k;

for(k=1;k

內部排序 堆排序

堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。堆分為大頂堆和小頂堆,滿足key i key 2i 1 key ...

內部排序 堆排序初探

堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...

內部排序之選擇排序 簡單選擇排序和堆排序

1.簡單選擇排序 基本思想 給定待排陣列,共n個元素,依次比較n個元素,選擇出最大值 或最小值 與a 0 元素替換,然後比較剩下的n 1個元素,同樣得到最大值最大值 或最小值 與a 1 元素替換,以此類推,重複進行。直到n 1 此時 陣列順序已排好 降序或公升序 實現 簡單選擇排序 基本思想 在要排...