1.簡介
堆排序是指利用堆這種資料結構所設計的一種排序演算法。
2.堆排序中大堆和小堆
大堆:根節點比子節點大
小堆:跟節點比子節點小
3.核心思想
採用大堆的資料結構為例子。
陣列轉完全二叉樹,再把這個完全二叉樹構成乙個大堆,
將堆頂根節點和末尾節點互換。
把剩下的n-1個元素重新構造成大頂堆(最大值已經換到結尾處,我們不在去考慮,再找剩下n-1個數的最大值)
再次交換堆頂根節點和末尾節點…
重複操作直到最後只剩下乙個數
4.步驟
(1).首先構造大堆
(2).把堆頂根節點和末尾節點互換
(3).剩下n-1和節點再次構造大堆
(4).重複操作
5.時間複雜度
nlogn ( n代表有n個數字要被構造為堆頂根節點,logn一棵樹的高度,
最壞情況下,每個店都要冒一棵樹的高度才能成為堆頂的根節點)
6.**實現
public class heapsort
//(1).首先構造大堆
buildmaxheap(a);
for(int i = a.length -1;i >= 1;i --)
} private void buildmaxheap(int a)
//堆排序的優點體現在這裡
//只用遍歷所有根節點就可以找出最大值
int half = (a.length - 1)/2;
//這裡等於0也是要取的
for(int i = half;i >= 0;i --)
}/* *length表示可控長度為,有多少節點要來構造大堆
* i 表示我是以哪個節點為堆頂根節點來構造的
*/private void maxheap(int a, int length, int i)
//左子節點
int left = i * 2 + 1;
//右子節點
int right =i * 2 + 2;
//設定最大值下標
//暫時設為i
int largest = i;
//left < length要放在a[left] > a[i] 前面
//不然會報溢位異常
if (left < length && a[left] > a[i] )
if ( right a[largest] )
//如果最大值的位置受到了變更
if (largest != i) }
private void exchangeelements(int a, int i, int j)
public static void main(string args) ;
heapsort heapsort = new heapsort();
heapsort.heapsort(a);
system.out.println(arrays.tostring(a)); }
}
常見排序演算法 堆排序演算法
基本思想 先將待排序資料化為完全二叉樹,從length 2 1處開始尋找他的左 右子節點,將較大值與父節點進行交換,最後遍歷到根節點處,此時根節點為所有數中的最大值,將該值與最後乙個元素進行交換,length length 1,又從父節點開始進行比較,繼續尋找較大值。將找到的較大值與length 2...
常見的排序演算法 堆排序
堆是一種特殊的樹形結構,其每個節點都有乙個值,通常的堆指的是一顆完全二叉樹,根的節點大於 或小於 兩個子節點的值,而堆排序是一種樹形選擇排序,在排序過程中將a 0 n 看做是完全二叉樹的順序儲存結構,利用完全二叉樹中父節點與子節點的內在關係來選擇最小的元素或者最大的元素。堆分為大頂堆和小頂堆,父節點...
排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...