演算法導論複習(3) 堆排序

2021-07-31 08:55:25 字數 1784 閱讀 3274

堆排序與歸併排序具有相同的時間複雜度o(nlgn),但是在講堆排序之前,先要搞清楚堆排序使用的「二叉堆」
二叉堆是乙個陣列,可以被看成近似的完全二叉樹

特點:

1.樹上每一節點對應乙個元素,除最底層外,樹是完全充滿的,而且從左到右填充。

2.

a(大頂堆):根節點的值是大於等於任何子節點的值

b(小頂堆):根節點的值是小於等於任何子節點的值

3.每個節點的左子樹和右子樹均為乙個二叉堆

通過以上特點,將乙個陣列的所有元素依次放入二叉堆中,設數的根節點為a[i],給定乙個節點下標為i,則可以得到節點的父節點,左孩子和右孩子的下標:

父節點:i/2

左孩子:2*i

右孩子:2*i+1

介紹完基本知識,書本上介紹了最大堆排序的步驟及時間複雜度:

max-heapify(對於單個二叉堆的排序演算法) 時間複雜度o(lgn)

build-max-heap(建二叉堆演算法) 時間複雜度o(n)

heapsort(對陣列排序) 時間複雜度o(nlgn)

一、max-heapify

這個步驟的目的是維護最大堆性質,輸入為陣列a和下標i,在呼叫max-heapify時,假定左子樹和右子樹均為最大堆,但a[i]可能小於孩子,所以通過讓a[i]逐級下降,使得下標i為根節點的子樹滿足最大堆性質。

**展示:

int maxheapify(int

*a,int i,int

size)

else

if(r<=size&&a[r]>a[largest]) //右孩子與根節點

if(largest!=i)

}}

分析時間代價:

1。調整a[i]和左孩子、右孩子關係θ(1)

2。以i的乙個孩子為根節點的子樹執行max-heapify時間

遞迴式:t(n)=t(2n/3)+θ(1)

遞迴式的解為o(lgn)(主定理方法2),所以樹高為n的結點,max-heapify時間複雜度為o(n)

二、建堆

根節點下標為a.length/2,葉節點下標為(n/2+1)、(n/2+2)…(n),所以對a.length/2到1做max-heapify操作

int buildheap(int *a,int size) }

建堆的時間複雜度在88頁有詳細的介紹,這裡不詳細介紹了,主要的就是建堆的時間複雜度是o(n).

三、堆排序

對大頂堆,因為根節點的值是陣列中也是二叉堆中最大的,所以每次把根節點取走,然後剩下的排出最大根節點再取走,依次就可以完成陣列從大到小排序,反之從小到大排序是在小頂堆中每次取根節點所得。

**:

int heapsort(int

*a,int

size)

}

因為是建堆的時間複雜度是o(n),要呼叫max-heapify(n-1)次,每次時間o(lgn),所以堆排序的時間複雜度是o(nlgn)

演算法導論 6 堆排序

堆的分類 最大堆性質 高度 對於堆的一些基本操作 偽 描述 實現 max heapify python實現 123 4567 891011 1213 def max heapify i print max heapify i l left i r right i if l heap size and...

演算法複習(1) 堆排序

堆是一種完全二叉樹結構,以陣列儲存 堆的最後一層從左開始填充 對於元素個數為n的堆來說,高度為 floor lgn 對於給定下標i 從0開始 父節點,左兒子,右兒子分別為 parent i return i 1 1 left i return 2i 1 right i return 2i 2堆排序主...

演算法 3 堆排序

堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...