自己還不會的堆排序

2021-10-18 23:15:14 字數 2258 閱讀 8973

之前堆排序我只聽說過,但是還一直沒有學到,這次來學習一下。

那我們就來說說堆是什麼吧

:堆通常是乙個可以被看做一顆完全二叉樹的陣列物件,它的特點是子節點的鍵值或索引總是小於等於(或大於等於)它的父節點。(這麼說就是要麼一定比父節點及其直屬關係(我發明的詞懂就好)的節點大或小)

根節點最大的堆叫最大堆或大根堆,根節點最小的堆叫最小堆或小根堆,對左右子節點的大小關係沒有要求。

大致原理:利用大根堆或小根堆思想,首先建立堆,然後將堆首與堆尾交換,堆尾之後為有序區

構建堆中有上浮下沉的概念

上浮:如果乙個節點比父節點大,那麼要交換兩個節點;交換後可能比它新的父節點還大,因此還要不斷進行比較和交換,把這種稱為上浮

下沉:類似的,乙個結點比原來子節點小,就向下比較和交換,稱為下沉;乙個結點若有兩個子節點,應與最大子節點進行交換

構建初始堆,將待排序列構建成乙個大根堆(或小根堆),想要結果公升序就構建大根堆,想要降序就構建小根堆(後面要與末位交換)

此時,序列的的最大值即為堆頂的根節點

將堆頂元素與當前堆末尾元素交換,並斷開(從待排序列中移除)堆尾元素,(相當於最後的就是已經排好序的部分了,後面再操作就是對尚未排序的部分進行構建堆)此時末尾就是最大值

重新構建堆

重複2~3,直到待排序列中只剩下乙個元素(堆頂元素)

這樣最主要的開銷就在於每次對於待排序序列的堆構建過程,將根節點和堆尾元素互換只是每次構建堆之後順手的事(但是也很重要),構建堆的時間複雜度是o(nlogn),故堆排序的時間複雜度也為o(nlogn)

下面是的演示,圖上是樹的形式,但是我們是用陣列儲存的,是完全二叉樹的層次遍歷陣列。

這是gif**演示

這裡直接復用了這篇部落格的**

/**

* @classname heapsort

* @description 堆排序

* @author 滑技工廠

* @date 2021/2/4

* @version 1.0

*/public

class

heapsort

;int

arr =

;heapsort

(arr)

;for

(int i : arr)

}/**

* 建立堆,

** @param arr 待排序列

*/private

static

void

heapsort

(int

arr)

//調整堆結構+交換堆頂元素與末尾元素

for(

int i = arr.length -

1; i >

0; i--)}

/** * 調整堆

** @param arr 待排序列

* @param parent 父節點

* @param length 待排序列尾元素索引

*/private

static

void

adjustheap

(int

arr,

int parent,

int length)

// 如果父結點的值已經大於孩子結點的值,則直接結束

if(temp >= arr[lchild]

)// 把孩子結點的值賦給父結點

arr[parent]

= arr[lchild]

;//選取孩子結點的左孩子結點,繼續向下篩選

堆排序 自己的理解

堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,可以利用陣列的特點快速定位指定索引的元素。要理解排序演算法首先要知道堆的定義 堆 即一顆完全二叉樹,樹中任乙個非葉子節點的關鍵字均不大於 或者均不小於 其左右孩子 若存在 節點的關鍵字。比如說想下面這樣的完全二叉樹就叫...

辣雞ZY還不會的

省選不會考吧 linear algebra 特徵向量,特徵矩陣的那套理論 暫時不學 group theory schreier sims演算法 暫時不學 discrete mathematics 生成函式的那套理論,還有別的hhh 多項式的那套理論,畢克給我開啟了一扇新世界的大門hhh operat...

你還不會ES的CUD嗎?

近端時間在搬磚過程中對es進行了操作,但是對es查詢文件不熟悉,所以這兩周都在研究es,簡略看了 elasticsearch權威指南 摸摸魚又是一天。es是一款基於lucene的實時分布式搜尋和分析引擎,今天咱不聊其應用場景,聊一下es索引增刪改。環境 centos 7,elasticsearch6...