《演算法(第四版)》排序 堆排序

2021-07-11 02:10:37 字數 1083 閱讀 5221

1.什麼是堆?

講堆排序之前,先了解一下什麼是堆。堆其實相當於一種資料結構,它的本質是一種陣列物件,但是它裡面的內同又是一顆完全二叉樹結構,它的特點是父節點的值大於(或小於)兩個子節點的值,常常用於優先佇列、堆排序等。

堆在陣列中的索引有如下的特點。陣列索引為k的元素,它的父節點的索引為[k/2](下取整),它的兩個子節點索引為2k, 2k+1,依次類推

2.堆排序的基本過程

(1)構造乙個堆

如果給定乙個陣列,只需要從左到右遍歷陣列,用swim()保證掃瞄指標左側的所有元素已經是一顆堆有序的完全二叉樹即可,就像連續向優先佇列中插入元素一樣,但是更有效的辦法是由又想做用sink()下浮的方式來構造堆。

(2)基本思想

用白話來講,堆排序是很簡單的,你先用下沉的方法構造了乙個堆後,堆有乙個特點啊,那就是它的第乙個元素永遠是最大(或最小)的,如果你想從小到大排,那就把首元素和最後乙個元素交換,肯定沒毛病,這樣最大的就歸位了。下一步再把前n-1個元素利用下沉恢復堆的結構,這樣倒數第二大的有跑到最前面了,那就讓它再和倒數第二個交換就行了,依次類推。。。。

參照《演算法第四版》**

(3)具體**實現:

public static void  heapsort(comparable a)

while(n>1)

}//觀察可以發現,此處的sink不是之前的部落格講的只傳入int k 讓某個元素下沉就好,此處傳入了a ,n,因為這個n是變化的,不斷的在減小

public static void sink(comparable a, int i, int j)

}

(4)說明

堆排序在現代系統的許多應用很少用到它,因為它無法利用快取,但是用堆實現的優先佇列在現在應用中越來越重要,因為它能插入操作和刪除最大元素混合動態場景中保證對級數級別的執行時間,尤其是資料量較大時用,比如10億個元素中,選出最大的10個等。

演算法 第四版 之堆排序

堆排序是建立在堆的基礎上的,了解堆排序我們得先了解二叉堆.二叉堆是以二叉樹為基礎的,當一棵二叉樹的每個結點都大於等於它的兩個子節點數時,它被稱為堆有序.我們可以很容易的理解出,它的根節點是最大節點 二叉堆可以用指標和陣列兩種方式表示,本文用的是陣列的方式.我們在堆中有兩種操作方法,一種叫做上浮,一種...

《演算法(第四版)》排序 希爾排序

由 插入排序 可知,它是一種不穩定的演算法,當序列已經接近有序時,排序速度較快,但是如果最小的在最後面,那可能需要最小的交換了n 1次才能換到最前面。希爾排序在插入排序的基礎上進行了改進,交換不相鄰的元素,以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序,具體做法如下。1.假設陣列長...

《演算法(第四版)》排序 模板

本書對排序類演算法有乙個模板,包括了以下幾種方法 1 sort 這個方法裡面實現的就是排序的演算法 2 less 這個方法裡是利用了comparable介面裡的compareto方法,其中compareto方法對於本物件與傳入的比較物件小於,等於,大於,分別返回負數,0,正數 這個方法如果compa...