最簡單易懂的堆排序

2021-09-16 13:16:09 字數 1283 閱讀 1025

堆排序

a) 堆排序是一種原地的、時間複雜度為o(nlogn)的排序演算法.

b) 如何理解」堆"? 堆是一種特殊的樹

堆是乙個完全二叉樹

堆中每乙個節點的值都必須大於等於(或小於等於)其子樹中每個節點的值。

對於每個節點的值都大於等於子樹中每個節點值的堆,我們叫做」大頂堆」。對於每個節點的值都小於等於子樹中每個節點值的堆,我們叫做」小頂堆」。

往堆中插入乙個元素,堆化,堆華實際上有兩種,從下往上和從上往下。

我們先從下往上的堆化,如下圖

往堆中插入資料的過程:

public class heap 

public void insert(int data)

} }

刪除堆頂元素

從上往下的堆化方法 ,如下圖:

刪除堆的**:

public void removemax()

private void heapify(int a, int n, int i)

}如何基於堆實現排序?

堆排序的過程大致分解成兩個大步驟,建堆和排序。

從後往前處理陣列,並且每個資料都是從上往下堆化,如下圖

建堆的時間複雜度就是 o(n)o(n)o(n)。

2)、堆排序

建堆後,陣列中的資料已經是按照大頂堆的特性來組織的,陣列中的第乙個元素就是堆頂,也就是最大的元素。

這個過程有點類似講的」刪除堆頂元素」的操作,當堆頂元素移除之後,我們把下標為n的元素放到堆頂,然後再通過堆化的方法,將剩下的n-1個元素重新構建成堆。堆化完成之後,我們再取堆頂的元素,放到下標是n-1的位置,一直重複這個過程,直到最後堆中只剩下標為1的乙個元素,排序工作就完成了。

堆排序的**如下:

// n 表示資料的個數,陣列 a 中的資料從下標 1 到 n 的位置。

public static void sort(int a, int n) 

}

簡單易懂的講堆排序

堆排序利用二叉堆來進行排序,而二叉堆用完全二叉樹代替 因為易於儲存和索引 乙個陣列就可以儲存完全二叉樹。但堆並不一定是完全二叉樹,堆還有更複雜的,就不一一枚舉 怎麼用陣列儲存呢?對於每乙個節點i,其父節點為i 2,其左右子節點分別為i 2,i 2 1 如圖 怎麼進行排序呢,我們分為兩個大步驟 1,構...

最簡單易懂的raid

特點 平行儲存,將資料都分到每個硬碟裡面,一塊硬碟的損壞都會導致資料的不完整,不可用 磁碟數量 1塊或者n塊 磁碟容量 一共磁碟的總和 優點 讀寫效能比較高 缺點 無冗餘與備份,安全性比較低 應用環境 安全性要求不高的地方,比如圖形工作站 特點 映象儲存,就是將每乙個磁碟都寫入相同的資料,以保證使用...

簡單的堆排序

堆排序的是先建立乙個完全二叉樹,之後調整成乙個大頂堆,再進行堆調整的過程!include include 時間函式 include using namespace std int h 101 用來存放堆的陣列 int n 用來儲存堆中元素的個數,也就是堆的大小 void swap int x,int...