堆和堆排序

2022-06-28 16:42:16 字數 3050 閱讀 6273

普通佇列:先進先出,後進後出

優先佇列的實現:

入隊出隊

普通陣列

o(1)

o(n)

順序陣列

o(n)

o(1)

堆o(logn)

二叉堆的特點:這很重要!!! 是核心

用陣列儲存二叉堆

這樣用陣列儲存的堆中元素和陣列下標有以下規律:  這很重要!!! 是核心

最大堆**實現 (逐步的實現,下面只是簡單的定義,各種操作的方法後續依次加入) :

1

public

class

maxheap

1617

public

intsize()

2021

public

boolean

isempty()

2425 }

往最大堆中新增元素(shiftup)

根據前面對最大堆的定義(任意子節點小於其父節點) 以及元素下標之間的關係,我們不斷交換父子節點的位置,知道滿足最大堆的原則,就完成了元素插入。下面是**實現:

/**

* 往最大堆中加入乙個元素

* @param

e

*/public

void insert(int

e) }

/*** 根據堆的定義,交換父子節點的位置,直到滿足最大堆的原則

* @param

k

*/private

void shiftup(int

k) }

刪除最大堆中的元素(shiftdown)

根據優先佇列的定義,元素的出順序按照優先順序,而在最大堆中,根節點的優先順序就是最大的,因此我們刪除的時候,總是從根節點開始。

具體的思路是,首先交換根節點和最後乙個節點的位置,然後刪除掉交換後的根節點,也就是最大值,然後根據堆的定義交換節點位置維護最大堆的原則,最後返回刪除了的最大值即可。**實現如下:

/**

* 交換根節點和最後乙個節點的位置,再將移除的根節點的值返回,並維護最大堆的原則

* @return

原堆中的最大值

*/public

intextractmax()

return -1;

}/*** 交換節點的位置 維護最大堆的定義

* @param

k 開始的節點位置

*/private

void shiftdown(int

k)

if (data[k]

else}}

通過上面的努力,我們實現了乙個基本操作的最大堆。如果前面的明白了的話,那麼實現乙個堆排序就是小問題了,因為我們的最大堆的輸出順序就是由大到小的,那麼排序的問題不過是將陣列的順序反過來 .

public

static

void heapsorted1(int

arr)

for (int i = n - 1; i >= 0; i--)

}

最大堆的另外一種構造方法 —— heapify

在前面構造最大堆的實現中,我們都是首先構造乙個初始化容量的陣列,然後依次加入陣列的每個元素。現在我們考慮乙個情況,因為最大堆的儲存本身就是陣列實現的,那麼當我們對陣列需要排序的時候,是否可以直接將這個陣列構造成為最大堆呢,而無需逐個的複製元素並shiftup?答案是肯定的。

具體的思路是:將待排序的陣列本身看成是一棵二叉樹,在這課二叉樹中,所有不同的非葉子節點就是不用的最大堆。那麼我們就從這棵二叉樹的第乙個非葉子節點開始執行shiftdown操作,直到整棵二叉樹滿足最大堆的原則。那麼問題又來了?第乙個非葉子是多少呢,這裡又有乙個規律:完全二叉樹的排列中,第乙個非葉子節點 i 等於陣列的長度 (n - 1) / 2.**實現如下:

//

heapify 的過程

public maxheap(int

arr)

size =n;

//第乙個非葉子節點的下標 (n-1) / 2

for (int i = (n - 1) / 2; i >= 0; i--)

}public

static

void heapsorted2(int

arr)

}

public

static

void heapsorted3(int

arr)

//for (int i = n - 1; i > 0; i--)

}/*** 原地堆排序的shiftdown操作

* @param

arr *

@param

n *

@param

i

*/private

static

void __shiftdown(int arr, int n, int

i)

if (arr[j] >arr[i])

else

break

; }

}

堆和堆排序

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

堆和堆排序

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

堆和堆排序

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