**:
堆排序:
特點堆排序(heapsort)是一樹形選擇排序。堆排序的特點是:在排序過程中,將r[l..n]看成是一棵完全二叉樹的順序儲存結構,
利用完全二叉樹中雙親結點和孩子結點之間的內在關係(參見二叉樹的順序儲存結構),在當前無序區中選擇關鍵字最大(或最小)的記錄
堆排序與直接選擇排序的區別直接選擇排序中,為了從r[1..n]中選出關鍵字最小的記錄,必須進行n-1次比較,然後在r[2..n]中選出關鍵字
最小的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經做過,但由於前一趟排序時未保留
這些比較結果,所以後一趟排序時又重複執行了這些比較操作。
注:堆排序可通過樹形結構儲存部分比較結果,可減少比較次數。
演算法分析
堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過呼叫heap實現的。
堆排序的最壞時間複雜度為o(nlogn)。堆序的平均效能較接近於最壞效能。
由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。
堆排序是就地排序,輔助空間為o(1),
它是不穩定的排序方法。
實在如下:
/*filename:myheapsort.cpp
author: xiaobing
e-mail: [email protected]
date: 2013-08-27
*/#include#include#include#include#define n 10
using namespace std;
void swap(int *a, int *b)
/* 堆排序實現
n個關鍵字序列kl,k2,…,kn稱為(heap),當且僅當該序列滿足如下性質(簡稱為堆性質):
(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),當然,這是小根堆,大根堆則換成》=號。
k(i)相當於二叉樹的非葉結點,k(2i)則是左孩子,k(2i+1)是右孩子
若將此序列所儲存的向量r[1..n]看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:
樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。
實現原理:
1。開始時,需將陣列建立為乙個堆,使得其滿足所有的非葉節點的值都大於等於(或小於等於)其左右
孩子節點的值,這樣的效果使得第乙個節點,即根節點總是最大的元素。
2.從最後乙個陣列元素開始與陣列第乙個元素交換資料,交換一次後,再創新建立堆,但堆的長度減1,直到
陣列長度變為1為止,這樣就排序完成
注:使得每個非葉節點的值都大於等左右孩子節點的值,是實現由小到大排序
相反,是實現由大到小排序。
*//*
*@prama arr 待排序的陣列
@prama i 待開始調整的位置
@prama length 調整的範圍,當然,開始時是陣列長度,但後面會越來越小直到為1
* */
void heapadjust(int arr, int i, int length)
//如果孩子節點比父節點大,因為剛才已經確定了arr[child]是左右孩子中的大著
//更新父節點為大值
if(arr[child] > temp) else
//若更新後,則交換值,若沒有更新,則已經退出了,不能執行到此
arr[child] = temp; }}
/* @prama arr 待排序的陣列
@prama length 陣列的長度
*/void heapsort(int arr, int length)
//實現第二步
/* *這裡是從最後元素開始調整,不斷縮小範圍,直到第乙個元素為止
*/for(i = length - 1;i > 0;i--)
}void print(int arr, int n){
int i;
for(i = 0; i < n;i++){
cout<
堆排序的詳細講解及實現
堆排序 特點 堆排序 heapsort 是一樹形選擇排序。堆排序的特點是 在排序過程中,將r l.n 看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係 參見二叉樹的順序儲存結構 在當前無序區中選擇關鍵字最大 或最小 的記錄 堆排序與直接選擇排序的區別直接選擇排序中...
堆排序 heap sort 演算法講解與實現
開始時,堆不可能是這個樣子,因為,將陣列轉化為樹,是有規則的,必須把左邊填滿才能再填右邊。待排序陣列 a 46,30,82,90,56,17,95 組成乙個二叉樹,將46,30,82,90,56,17,95這幾個數字從儲存在陣列結構,轉變到二叉樹及結構,是通過為一些陣列下標賦予一些新的關係。比如,在...
堆排序原理和實現
1.堆排序原理 2.堆排序的手寫實現 step 1 構造初始堆 初始化堆時是對所有的非葉子結點進行篩選 最後乙個非終端元素的下標是 n 2 向下取整,所以篩選只需要從第 n 2 向下取整個元素開始,從後往前進行調整。step 2 進行堆排序 堆排序是一種選擇排序。建立的初始堆為初始的無序區。排序開始...