堆和堆排序

2021-10-16 21:46:08 字數 996 閱讀 7977

1、堆一定是完全二叉樹(除了最後一層,其他層一定是滿的)

2、堆分為「大根堆」、「小根堆」,「大根堆」的父節點一定大於葉子節點,「小根堆」的父節點一定小於葉子節點。

堆一般使用陣列來儲存,節省空間,可以不用儲存左右子節點,從下標為1的陣列開始,可以直接通過根節點 * 2 和 *2 + 1來訪問。

建堆有兩種方式,

第一種是從第乙個父節點開始,不斷往上堆化,直到根節點

void

swaparr

(int a,

int i,

int j)

void

heapify

(int a,

int i,

int n)

}void

buildheap

(int a,

int n)

}

第二種是將第乙個數作為堆,然後不斷往堆尾插入資料,然後從下往上堆化,直到最後乙個葉子節點,**如下。

void

insertbuildheap

(int a,

int n)

}}

首先將資料插入堆尾,然後自下而上堆化,參考第二種建堆方式。

我們首先將堆尾資料覆蓋掉堆頂資料,然後自上而下堆化

如果前面的建堆和刪除堆頂理解了後,堆排序也就很簡單了,每一次堆化1到n的資料後,最大值或最小值都在根節點,將根節點和堆尾節點交換,然後繼續堆化1到n-1的資料,一直到根節點結束。

void

heapsort

(int a,

int n)

}

1、建堆過程的時間複雜度是 o(n),排序過程的時間複雜度是 o(nlogn),堆排序整體的時間複雜度是 o(nlogn)。

2、排序過程中只涉及交換操作,生成常量的空間,所以是原地排序。

3、在排序過程中,每一次會將最後乙個資料與第乙個資料相交換,所以是不穩定排序。

堆和堆排序

堆是一種靈巧的 部分有序的資料結構,它尤其適合用來實現優先佇列。優先佇列是元素的乙個集合,其中每個元素都包含乙個被稱為元素優先順序的可排序屬性。優先佇列支援下面的操作 通過採用堆這種資料結構可以高效實現這些操作。下文分兩部分 第一部分介紹堆 第二部分講解堆排序。堆可以定義為一棵二叉樹,樹的節點中包含...

堆和堆排序

這個題大意是有乙個資料結構支援兩種操作a與 get操作,其中 a x表示插入 x.get i 表示返回結構中的第 i小的數.給你 a和get操作的順序和引數 現在要你對每個 get輸出值 題解 每次取第k小元素,k不斷更新。使用兩個堆,來完成。小頂堆負責選出最小的元素,大頂堆負責選出k個元素中最大的...

堆和堆排序

堆排序演算法 優先佇列 堆的性質的維護,以下都以最大堆為例。堆的維護的主要思想是 逐層下降 舉例 某個結點i,假設其左右子結點left i right i 都已經是最大堆,那麼需要調節 或者說是調換 i,left i right i 的值,並保證調換後的子樹繼續調換下去直到子樹繼續滿足堆的性質。首先...