普通佇列:先進先出,後進後出
優先佇列的實現:
入隊出隊
普通陣列
o(1)
o(n)
順序陣列
o(n)
o(1)
堆o(logn)
二叉堆的特點:這很重要!!! 是核心
用陣列儲存二叉堆
這樣用陣列儲存的堆中元素和陣列下標有以下規律: 這很重要!!! 是核心
最大堆**實現 (逐步的實現,下面只是簡單的定義,各種操作的方法後續依次加入) :
1往最大堆中新增元素(shiftup)public
class
maxheap
1617
public
intsize()
2021
public
boolean
isempty()
2425 }
根據前面對最大堆的定義(任意子節點小於其父節點) 以及元素下標之間的關係,我們不斷交換父子節點的位置,知道滿足最大堆的原則,就完成了元素插入。下面是**實現:
/**刪除最大堆中的元素(shiftdown)* 往最大堆中加入乙個元素
* @param
e
*/public
void insert(int
e) }
/*** 根據堆的定義,交換父子節點的位置,直到滿足最大堆的原則
* @param
k
*/private
void shiftup(int
k) }
根據優先佇列的定義,元素的出順序按照優先順序,而在最大堆中,根節點的優先順序就是最大的,因此我們刪除的時候,總是從根節點開始。
具體的思路是,首先交換根節點和最後乙個節點的位置,然後刪除掉交換後的根節點,也就是最大值,然後根據堆的定義交換節點位置維護最大堆的原則,最後返回刪除了的最大值即可。**實現如下:
/**通過上面的努力,我們實現了乙個基本操作的最大堆。如果前面的明白了的話,那麼實現乙個堆排序就是小問題了,因為我們的最大堆的輸出順序就是由大到小的,那麼排序的問題不過是將陣列的順序反過來 .* 交換根節點和最後乙個節點的位置,再將移除的根節點的值返回,並維護最大堆的原則
* @return
原堆中的最大值
*/public
intextractmax()
return -1;
}/*** 交換節點的位置 維護最大堆的定義
* @param
k 開始的節點位置
*/private
void shiftdown(int
k)
if (data[k]
else}}
public最大堆的另外一種構造方法 —— heapifystatic
void heapsorted1(int
arr)
for (int i = n - 1; i >= 0; i--)
}
在前面構造最大堆的實現中,我們都是首先構造乙個初始化容量的陣列,然後依次加入陣列的每個元素。現在我們考慮乙個情況,因為最大堆的儲存本身就是陣列實現的,那麼當我們對陣列需要排序的時候,是否可以直接將這個陣列構造成為最大堆呢,而無需逐個的複製元素並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)
}
publicstatic
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 的值,並保證調換後的子樹繼續調換下去直到子樹繼續滿足堆的性質。首先...