堆排序(heapsort)是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a[parent[i]] >= a[i]。在陣列的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。
若在輸出堆頂的最小值之後,使得剩餘n-1個元素的序列重又建成乙個堆,則得到n個元素中的次小值。如此反覆執行,便能得到乙個有序序列,這個過程稱之為堆排序。
由此可知,實現堆排序需要解決兩個問題:
如何由乙個無序序列建成乙個堆?
如何在輸出堆頂元素之後,調整剩餘元素成為乙個新的堆?
下面首先圖示建初始堆:
下面首先圖示調整堆:
好啦,下面演示**:
首先是標頭檔案data.h
#define maxsize 20 // 乙個用作示例的小順序表的最大長度
typedef
int keytype; // 定義關鍵字型別為整型
typedef
int infotype; // 定義資料項型別為整型
typedef
int elemtype; // 定義元素型別為整型
typedef
int infotype; // 定義其它資料項的型別
struct redtype // 記錄型別
; struct sqlist // 順序表型別
; typedef sqlist heaptype; // 堆採用順序表儲存表示
bool lt(int a,int b)
}
接下來是heapsort.cpp
// c10-1.h 待排記錄的資料型別
#include
#include
#include"data.h"
#include
using
namespace
std;
void heapadjust(heaptype &h,int s,int m)
h.r[s]=rc; // 插入
} void heapsort(heaptype &h) }
void print(heaptype h)
#define n 8
void main()
,,,,,,,};
// redtype d[n]=,,,,,,,};
heaptype h;
int i;
for(i=0;i1]=d[i];
h.length=n;
printf("排序前:\n");
print(h);
cout
heapsort(h);
printf("\n排序後:\n");
print(h);
system("pause");
}
下面是演示結果
從這裡看來貌似堆排序是穩定的,其實不然,堆排序是不穩定的
下面舉反例:
redtype d[n]=,,,,,,,};
排序後的結果當然就是:
到了前面。
圖示之
這一次我們沒有像上次一樣幾個內部排序演算法一起比較,但是這裡還是給出一般結論吧。
內部排序 堆排序
堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 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 ...
排序演算法 堆排序初探
思想步驟 實現 堆 heap 是一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵完全二叉樹的陣列物件。binary tree 二叉樹 是樹的一種,主要的特點是二叉樹的所有節點最多只有兩個葉節點。除此之外沒有別的要求。complete binary tree 完全二叉樹 二叉樹的一種。在完全二叉樹...
內部排序之堆排序
堆排序 heap sort 只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。1 基本概念 a 堆 設有n個元素的序列 對所有的i 1,2,int n 2 當滿足下面關係 ki k2i,ki k2i 1 或 ki k2i,ki k2i 1 這樣的序列稱為堆。堆的兩種型別 根結點最小的...