資料結構之堆排序(java)

2021-08-13 11:50:40 字數 1725 閱讀 1223

演算法描述

堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。

堆實際是一棵完全二叉樹。

完全二叉樹要麼是滿二叉樹,要麼是在成為滿二叉樹的路上。

滿二叉樹定義:除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點(最後一層上的無子結點的結點為葉子結點)。也可以這樣理解,除葉子結點外的所有結點均有兩個子結點。節點數達到最大值。所有葉子結點必須在同一層上.

完全二叉樹定義:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

那麼從定義可以知道,第i各元素的父親節點為第(i-1)/2,左孩子節點為i*2+1,*右孩子節點為i*2+2。

下面來介紹大根堆。

根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆(大頂堆)。

(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個...