您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java排序算法之堆排序如何實現(xiàn),具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
二叉堆是完全二叉樹或者是近似完全二叉樹。
二叉堆滿足二個特性︰
1.父結(jié)點的鍵值總是大于或等于(小于或等于)任何一個子節(jié)點的鍵值。
2.每個結(jié)點的左子樹和右子樹都是一個二叉堆(都是最大堆或最小堆)。
任意節(jié)點的值都大于其子節(jié)點的值——大頂堆(最后輸出從小到大排)
任意節(jié)點的值都小于其子節(jié)點的值———小頂堆(最后輸出從大到小排)
1.堆化,反向調(diào)整使得每個子樹都是大頂或者小頂堆(建堆)
2.按序輸出元素∶把堆頂和最末元素對調(diào),然后調(diào)整堆頂元素(排序)
public class HeapSort { private static void heapSort(int[] arr) { // 構(gòu)造初始堆(大頂堆),從第一個非葉子節(jié)點開始調(diào)整,左右孩子節(jié)點中較大的交換到父節(jié)點中 for (int i = arr.length / 2 - 1; i >= 0; i--) { heapAdjust(arr, i, arr.length); } // 調(diào)整堆結(jié)構(gòu),交換堆頂元素與末尾元素 for (int j = arr.length - 1; j > 0; j--) { swap(arr, 0, j);// 將堆頂元素與末尾元素進行交換 heapAdjust(arr, 0, j);// 重新對堆進行調(diào)整 } } private static void swap(int[] arr, int a, int b) { int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } // 調(diào)整大頂堆 private static void heapAdjust(int[] arr, int i, int len) { int temp = arr[i], index = 2 * i + 1; while (index < len) { if (index + 1 < len && arr[index] < arr[index + 1]) {// 如果左子結(jié)點小于右子結(jié)點,index指向右子結(jié)點 index += 1; } if (arr[index] > temp) {// 如果子節(jié)點大于父節(jié)點,將子節(jié)點值賦給父節(jié)點 arr[i] = arr[index]; i = index; index = 2 * i + 1; } else { break; } } arr[i] = temp; } public static void main(String[] args) { int[] arr = {1,28,3,21,11,7,6,18}; heapSort(arr); System.out.println(Arrays.toString(arr)); } }
時間復(fù)雜度:O(nlogN)
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Java排序算法之堆排序如何實現(xiàn)”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。