演算法描述
堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。
堆實際是一棵完全二叉樹。
完全二叉樹要麼是滿二叉樹,要麼是在成為滿二叉樹的路上。
滿二叉樹定義:除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點(最後一層上的無子結點的結點為葉子結點)。也可以這樣理解,除葉子結點外的所有結點均有兩個子結點。節點數達到最大值。所有葉子結點必須在同一層上.那麼從定義可以知道,第i各元素的父親節點為第(i-1)/2,左孩子節點為i*2+1,*右孩子節點為i*2+2。完全二叉樹定義:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。
下面來介紹大根堆。
根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆(大頂堆)。(1)把整個陣列變成大根堆:
每增加乙個元素,都把它和它父親節點的值進行比較,若當前元素的值較大,那就交換它與它父親節點的值,再依次比較再上一層節點,最後我們得到乙個根節點為所有子樹最大值的完全二叉樹。
(2)利用大根堆進行排序:
將大根堆的堆頂元素與最後乙個元素進行交換,再調成大根堆結構。即將調整後的堆頂依次往下沉。怎麼下稱具體看**實現。
演算法分析
時間複雜度:o(n*logn) 但常數項比較大
//建立大根堆的過程是o(n),接下來每乙個點下沉的高度最多為logn級別,一共n個元素,時間複雜度嚴格為o(n*logn)
空間複雜度:o(1)
//只用到有限的幾個額外變數
實現不能做到穩定性
code:
public
class heapsort
for (int i = 0; i < arr.length; i++)
int size = arr.length;
swap(arr, 0, --size);
while (size > 0)
}public
static
void
heapinsert(int arr, int index)
}public
static
void
heapify(int arr, int index, int size)
swap(arr, largest, index);
index = largest;
left = index * 2 + 1;}}
public
static
void
swap(int arr, int i, int j)
public
static
void
printarray(int arr)
for (int i = 0; i < arr.length; i++)
system.out.println();
}public
static
void
main(string args) ;
heapsort(arr);
printarray(arr);
}}
資料結構之堆排序
在資料結構中,堆排序是非常重要的乙個知識點,尤其像在期末考試 考研等計算機考試中經常會考察堆排序,並要求畫出示意圖.下面主要通過一道考研題目講述堆排序的知識,希望對大家有所幫助.文章內容參考嚴蔚敏的 資料結構 王道論壇的 資料結構 和自己的一些理解 參看動態圖 堆排序是一種樹形選擇排序方法,它的特點...
資料結構之堆排序
堆排序就是利用堆 本文利用大頂堆 進行排序的方法。它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。它的基本思想是,將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走 就是將它與堆陣列的末尾元素交換,此時末尾元素就是最大值...
資料結構之堆排序
堆具有完全二叉樹的性質 每個結點大於等於左右孩子的堆稱為大頂堆,或每個結點小於或等於左右孩子的堆稱為小頂堆。堆排序 將待排序的序列構建成乙個大頂堆,此時,最大值在整個堆的根結點。將它移走 其實就是將它與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的n 1個序列重新造成乙個,這樣會得到n個...