堆排序演算法

2021-10-13 12:36:00 字數 2082 閱讀 7508

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

是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆,反之則為小頂堆,注意 : 沒有 要求結點的左孩子的值和右孩子的值的大小關係。

一般公升序採用大頂堆,降序採用小頂堆

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

將根節點與最後乙個葉子結點互換,也就是將最大值與末尾元素互換,此時末尾元素就位最大值。

將除末尾元素外的n-1個元素重新構造成乙個大頂堆,然後重複123,最後就能實現全部有序了。

給定乙個原始陣列【4,6,8,5,9】

步驟一:構造初始堆。將給定無序序列構造成乙個大頂堆

1.此時我們從最後乙個非葉子結點開始(葉結點自然不用調整,第乙個非葉子結點arr.length/2-1=5/2-1=1,也就是下面的 6 結點),從左至右,從下至上進行調整

2.找到第二個非葉節點 4,由於[4,9,8]中 9 元素最大,4 和 9 交換。

3.這時,交換導致了子根[4,5,6]結構混亂,繼續調整,[4,5,6]中 6 最大,交換 4 和 6。

此時,我們就將乙個無序序列構造成了乙個大頂堆。

步驟二:將堆頂元素與末尾元素進行交換,使末尾元素最大。然後繼續調整堆,再將堆頂元素與末尾元素交換得到第二大元素。如此反覆進行交換、重建、交換。

1.將堆頂元素 9 和末尾元素 4 進行交換

2.重新調整結構,使其繼續滿足堆定義

3.再將堆頂元素 8 與末尾元素 5 進行交換,得到第二大元素 8.

4.後續過程,繼續進行調整,交換,如此反覆進行,最終使得整個序列有序

以上就是相關**,接下來話不多說上**

package com.structure.demo;

public

class

heapsort

;heapsort

(ints)

;for

(int i =

0; i < ints.length; i++)}

public

static

void

heapsort

(int

arr)

//2.將最大堆的頭結點與最後乙個葉子結點互換,然後將其餘部分再轉化為最大堆

for(

int i = arr.length-

1; i >

0; i--)}

public

static

void

adjustheap

(int

arr,

int i,

int length)

if(arr[j]

>temp)

else

}//在最後將頭結點的值賦給當前i指向的元素

arr[i]

=temp;

}}

排序演算法 堆排序

1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...

排序演算法 堆排序

花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...

排序演算法 堆排序

由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...