排序演算法 詳解堆排序演算法

2021-10-04 11:05:21 字數 1412 閱讀 8862

(1).原理

堆排序是一種選擇排序,通過實現大小堆,來取出堆頂的資料,然後和最後乙個交換,然後將堆的大小減一,迴圈這個過程直到,只有乙個資料時停止。

公升序建大堆,降序建小堆。

(2).問題:很多人會疑惑為什麼要交換之後再減小堆的大小呢?難道不交換就不能篩選出我們要的極值嗎?

首先向下調整演算法的時間複雜度為o(log n )

資料一共是n個

先交換再減小,堆的結構變化不大,我們只需要執行一次向下調整演算法,就可以重新建堆。

而直接取出堆頂的資料之後,堆的結構發生改變,重新建立堆的成本太大。

#define _crt_secure_no_warnings 1

#include

#include

#include

void

swap

(int

*p1,

int* p2)

//向下調整演算法用於建堆

堆排序的時間複雜度為o(nlogn)

空間複雜度為o(1)

有興趣可以去看看堆的實現

堆排序演算法詳解

最大堆 每乙個結點都比其子結點大的二叉樹。堆排序思想 把所有資料建成乙個最大堆,不停的把堆頂的元素取出來依次排列,取乙個數之後,剩下的數要維持最大堆結構 那麼堆排序主要分為 建成最大堆 維持堆結構 建最大堆 時間複雜度為o n 注意 在使用陣列表示的堆結構中,結點arr index 的父結點為arr...

排序演算法 堆排序

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

排序演算法 堆排序

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