1.堆的定義
堆是電腦科學中一類特殊的資料結構的統稱,堆通常可以被看做是一棵完全二叉樹的陣列物件。
特性:它是完全二叉樹,除了樹的最後一層結點不需要是滿的,其它的每一層從左到右都是滿的,如果最後一層結點不是滿的,那麼要求左滿右不滿。
它通常用陣列來實現。如果乙個結點的位置為k,則它的父結點的位置為[k/2],而它的兩個子結點的位置則分別為2k和2k+1。
.每個結點都大於等於它的兩個子結點。這裡要注意堆中僅僅規定了每個結點大於等於它的兩個子結點,但這兩個子結點的順序並沒有做規定,跟我們之前學習的二叉查詢樹是有區別的。
2. 需求
給定乙個陣列:string arr =
請對陣列中的字元按從小到大排序。
3. 實現步驟
構造堆;
得到堆頂元素,這個值就是最大值;
交換堆頂元素和陣列中的最後乙個元素,此時所有元素中的最大元素已經放到合適的位置;
對堆進行調整,重新讓除了最後乙個元素的剩餘元素中的最大值放到堆頂;
重複2~4這個步驟,直到堆中剩乙個元素為止。
4. 堆的構造
建立乙個新陣列,把原陣列[0, length-1] 的資料拷貝到新陣列的[ 1, length ] 處,再從新陣列長度的一半處開始往1索引處掃瞄(從右往左),然後對掃瞄到的每乙個元素做下沉調整即可。
5. 動畫演示
6. **實現
public
class
heapsort
implements
iarraysort
return arr;
}private
void
buildmaxheap
(int
arr,
int len)
}private
void
heapify
(int
arr,
int i,
int len)
if(right < len && arr[right]
> arr[largest])if
(largest != i)
}private
void
swap
(int
arr,
int i,
int j)
}
7. 複雜度分析&穩定性
時間複雜度:o(nlogn),不穩定。
排序演算法 7 堆排序
參考文章 前言 堆排序 快速排序 歸併排序的平均時間複雜度都為o n logn 要弄清楚堆排序,就要先了解下二叉堆這種資料結構。本文不打算完全講述二叉堆的所有操作,而是著重講述堆排序中要用到的操作。比如我們建堆的時候可以採用堆的插入操作 將元素插入到適當的位置,使新的序列仍符合堆的定義 將元素乙個乙...
排序演算法7 堆排序
0.引用 大頂堆 用來排公升序 1.什麼是堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點 的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 ...
排序演算法 (7)堆排序
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。首先簡單了解下堆結構。堆是具有以下性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 或者每個結點的值都小於或等於其左右孩子結點的值,稱為...