十大排序演算法之堆排序,最優實現

2021-10-06 23:24:13 字數 1420 閱讀 9087

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為0(nlogn),它也是不穩定排序。

堆是具有以下性質的完全二叉樹:

將待排序序列構造成乙個大頂堆 此時,整個序列的最大值就是堆頂的根節點。

將其與末尾元素進行交換,此時末尾就為最大值。

然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了。

package com.edu.sort;

/** * @date 2020/6/9 9:13

* @author by lishiyan

* @description 堆排序

*/public

class

heapsort

//2.將堆頂元素與末尾元素交換,將 arr[0] 元素"沉"到陣列末端

//3.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

for(

int i = arr.length -

1; i >

0; i--)}

/** * 將乙個陣列(二叉樹), 調整成乙個小頂堆

** @param arr 待調整的陣列

* @param i 表示非葉子結點在陣列中索引 arr.length/2-1

* @param length 陣列的大小

*/public

void

adjustheapdesc

(int

arr,

int i,

int length)

//如果子結點小於父節點

if(arr[j]

< temp)

else

arr[i]

= temp;}}

/** * 將乙個陣列(二叉樹), 調整成乙個大頂堆

** @param arr 待調整的陣列

* @param i 表示非葉子結點在陣列中索引 arr.length/2-1

* @param length 陣列的大小

*/public

void

adjustheapasc

(int

arr,

int i,

int length)

//如果子結點大於父節點

if(arr[k]

> temp)

else

}//當for 迴圈結束後,我們已經將以i 為父結點的樹的最大值,放在了 最頂(區域性)

//將temp值放到調整後的位置

arr[i]

= temp;

}}

十大排序演算法之堆排序

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法,它是一種選擇排序,時間複雜度是o n log n 本部落格將使用最大堆來實現堆排序。對於堆的具體描述在本部落格的這篇文章 已經對最大堆這種資料結構做出了介紹,故不做重複介紹,主要介紹堆排序。以下是最大堆結構具體實現過程 impo...

十大排序演算法之 堆排序 七)

堆排序 個人感覺算是十大排序演算法中較難的一種排序演算法。1 首先了解什麼是堆,需要滿足2個條件 滿足完全二叉樹 除了最後一層,每一層都是滿的,有右子樹的前提必需有左子樹 堆分為大頂堆和小頂堆,大頂堆 每乙個節點大於其左右子結點,小頂堆同理。2 完全二叉樹的特性 完全二叉樹適用於陣列儲存 對於乙個結...

十大排序 堆排序

堆排序屬於選擇排序 選擇排序的基本思想 每一趟 第i趟 在後面n i 1個待排序的元素中選取關鍵字最小的元素,作為有序子串行的第i個元素,直到第 n 1趟做完,待排序元素只剩下1個,就不用再選了。堆排序適合關鍵字較多的情況 n 1000 比如 在1億個數中選出前100個最大值?首先使用乙個大小為10...