排序(7)堆排序

2021-10-10 09:47:05 字數 1286 閱讀 1492

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 它也是不穩定排序。首先簡單了解下堆結構。堆是具有以下性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 或者每個結點的值都小於或等於其左右孩子結點的值,稱為...