將傳入的陣列看作是乙個沒有完成的堆
將堆整理排序成乙個大頂堆
將大頂堆最大的元素,也就是堆頂,與這個堆最後的元素進行交換
然後視這個除剛剛交換的那個元素外的陣列為乙個堆,對它進行大頂堆標準檢查,並將其整理成乙個大頂堆
有一點需要注意的是每次交換之後接下來需要接著排序的堆的大小需要減一!
為了減小空間的占用,可以視交換到末尾的元素為已經出堆的元素,僅僅對這些元素之前的陣列進行大頂堆檢查。
大頂堆是乙個被完全填滿的二叉樹,除了堆底部的葉子節點以外.其父節點必定要大於它的子節點,由這個特性,我們可以構造大頂堆。
設其父節點的下標為i
,那麼它的左兒子的下標就是2i+1
,其右兒子的下標就是左兒子加一也就是2i+2
。
由上面這個下標的規律我們可以直接從整個堆陣列的中部開始遍歷整個堆,因為觀察堆的結構可知,length/2 - 1
下標的節點是必定存在有左兒子的,所以我們不用擔心下標越界的問題。
遍歷的本質就是將每乙個元素都訪問到,這裡可以用遞迴,也可以用迴圈,遞迴對大資料並不友好,所以應該視情況而定!
調整的話主要是實現父節點與子節點的比較,如果父節點小於子節點的較大者,那麼就下沉。這裡小於較大者的原因是:因為小的元素要下沉就必須要跟兩個子樹中較大的那個進行交換,否則如果跟較小的節點進行交換的話可能還需要交換兩次!
。
/**
* myheapsort
*/public
class
myheapsort
; system.out.
println
("排序之前:");
for(
int i =
0; i < arr.length; i++
)// 堆排序
heapsort
(arr);
system.out.
println()
; system.out.
println
("排序之後:");
for(
int i =
0; i < arr.length; i++)}
public
static
void
heapsort
(int
arr)
// 將堆頂最大的那個元素和後面的元素進行交換,然後再生成大頂堆
for(
int i = arr.length-
1; i >=
0; i--)}
public
static
void
heapadjust
(int
arr,
int root,
int length)
// 如果此時的父節點小於子樹中的那個較大者,就與之交換!
if(father < arr[child]
)else
}// 由於當前下表為root的節點值可能是廢棄的,即已經被交換過,所以這個節點位置的應有值是該移動節點的值,即最初始的父節點
arr[root]
= father;
}public
static
void
exchange
(int
arr,
int began,
int end)
// 下面是我自己探索出來的堆排序,使用了過多的遞迴,導致空間**,效率很低
/** * 堆排序
** @param a
*/public
static
void
heapsort
(int
a,int index)
heapsort
(temp,
++index);}
/** * 構造小頂堆
** @param a
*/public
static
int[
]createheap
(int
a,int max)
for(
int i = b.length /2-
1; i >=
0; i--
)for
(int i =
0; i < b.length; i++
)return a;
}public
static
void
comparepartofheapsort
(int
a,int index)
if(k < a.length && a[index]
< a[k]
)// 比左右節點都要大,那麼就說明該節點在這個位置是正確的,然後返回
return;}
else
}}
資料結構 堆排序 堆排序 Heap Sort
堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...
資料結構 堆排序
include include void maxheapify int a,int length,int i void buildmaxheapify int a,int length void heapsort int a,int length void main void printf heap...
資料結構 堆排序
1 堆排序的時間複雜度與歸併排序相同,o nlogn 堆排序的優勢在與他只需要固定數量的額外空間,堆排序要比空間複雜性為o n 的歸併排序稍微慢一些,但是比空間複雜性為o 1 的歸併排序要快。2 對序列 26,5,77,1,61,11,59,15,48,19 進行堆排序 過程 調整最大堆 二叉堆 v...