排序演算法之 堆排序

2021-09-24 16:42:05 字數 1051 閱讀 6687

首先通過要排序陣列構造大頂堆(這一步可以將陣列的最大值放在陣列的首位)

交換陣列的首尾元素

陣列的長度減一繼續構造大頂堆,重複2

得到由小到大排序的陣列(大頂堆)

構造大頂堆:

start = (arr.length - 2) / 2; 找到第乙個非葉子節點(start 在這裡表示的都是非葉子節點)

public

static

void

sort

(int

arr)

for(

int i = arr.length-

1;i>

0;i--

)}

sort呼叫了adjust()函式

k = k*2+1 的作用是在取的最大值之後(也即是第一次構造完大頂堆)步驟3的過程,從0節點繼續往下構造大頂堆

public

static

void

adjust

(int

arr,

int length,

int start)

if(arr[k]

> temp)

else

arr[i]

= temp;

//更改子節點的值

}}

測試用例

public

static

void

main

(string[

] args)

;sort

(arr)

;for

(int a : arr)

}

排序結果

排序演算法之堆排序

前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...

排序演算法之堆排序

堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...

排序演算法之堆排序

宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...