經典排序之堆排序詳解

2022-05-08 18:09:14 字數 2383 閱讀 8446

首先我們來看看什麼叫做堆排序?

若在輸出堆頂的最小值之後,使得剩餘的n-1個元素的序列重新又構成乙個堆,則得到n個元素中的次小值,如此反覆,便能得到乙個有序序列,稱這個過程為堆排序。

再來看看總結一下基本思想:

將無序序列建成乙個堆

輸出堆頂的最小(大)值

使剩餘的n-1個元素又調整成乙個堆,則可得到n個元素的次小值

重複執行,得到乙個有序序列

通過上面的規律發現兩個問題,而堆排序需要解決這兩個問題:1.如何建堆? 2.如何調整?

n個元素的序列,當且僅當滿足下列關係時,成為堆:

解釋: 從上面可以知道,當父節點大於左右孩子節點 或者父節點小於節點的時候,可以稱為堆,前者稱為大頂堆,後者稱為小頂堆。

從第n/2 向下取整 個元素起,至第乙個元素止,進行反覆篩選,如果我們要建立大頂堆,先比較左右孩子的大小,將比較大的孩子和父節點進行比較。

因為陣列的元素一共是7個元素,我們應該從第3個元素,首先我們應該比較第3個元素的左右孩子的大小,然後再進行調整。

**如下:

// 建立大頂堆

public void buildheap(int arr)

} /**

* 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上)

** @param arr

* @param i

* @param length

*/public static void adjustheap(int arr, int i, int length)

if (arr[k] > temp) else

}arr[i] = temp;//將temp值放到最終的位置

}/**

* 交換元素

** @param arr

* @param a

* @param b

*/public static void swap(int arr, int a, int b)

當我們將陣列進行建立大頂堆或者小頂堆的時候,我們就會發現堆頂元素必然是該排序陣列的最大或者是最小的那個資料。如何在輸出堆頂元素後調整,使之成為新堆?

輸出堆頂元素後,以堆中最後乙個元素替代之

將根結點與左、右子樹根結點比較,並與小者交換

重複直至葉子結點,得到新的堆

解釋:

這時候我們將堆頂元素和最後乙個元素進行交換,那麼我們調整前n-1個元素成堆,反覆操作即可

時間效率:$ o(nlog2n) \(

空間效率:\) o(1)$

穩 定 性:不穩定

適用於n 較大的情況

public class heapsort ;

sort(arr);

system.out.println(arrays.tostring(arr));

}public static void sort(int arr)

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

for (int j = arr.length - 1; j > 0; j--)

}/**

* 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上)

** @param arr

* @param i

* @param length

*/public static void adjustheap(int arr, int i, int length)

if (arr[k] > temp) else

}arr[i] = temp;//將temp值放到最終的位置

}/**

* 交換元素

** @param arr

* @param a

* @param b

*/public static void swap(int arr, int a, int b)

}

經典排序演算法之堆排序

堆排序是一種選擇排序,是不穩定的排序方法。特點 在排序過程中,將排序陣列看成是一棵完全二叉樹儲存結構,利用完全二叉樹中父節點和孩子節點之間的內在關係,在當前無序區中選擇關鍵字最大 最小 的記錄。基本思想 堆分大根堆和小根堆,大根堆是父節點比所有子節點都大,小根堆是父節點比所有子節點都小。下面以大根堆...

經典排序演算法之堆排序

經典排序演算法之堆排序 若以公升序排序說明,把陣列轉換成最大堆積 max heap heap 這是一種滿足最大堆積性質 max heap property 的二叉樹 對於除了根之外的每個節點i,a parent i a i 重複從最大堆積取出數值最大的結點 把根結點和最後乙個結點交換,把交換後的最後...

經典演算法之堆排序

author s email wardseptember gmail.com date 2017.12.5 堆排序 堆是一種資料結構,可以把堆看成一棵完全二叉樹,這棵樹滿足 任何乙個非葉子 結點的值都不大於 或不小於 其左右孩子結點的值。若父親大 孩子小,則這樣的堆 叫做大頂推 若父親小 孩子大,則...