Java实现堆排序及详细图解
文章目錄
- 堆排序
- 前言
- 實現步驟
- 代碼實現
堆排序
前言
堆排序(HeapSort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似于完全二叉樹的結構,同時滿足子節(jié)點的鍵值總是小于(或者大于)其父節(jié)點。
每個節(jié)點的值都大于或者等于其左右子節(jié)點的值,稱為大頂堆;或者每個節(jié)點的值都小于或者等于其左右子節(jié)點的值,稱為小頂堆。
對堆中的節(jié)點按層進行編號,將這種邏輯結構映射到數組如下圖所示:
該數組從邏輯上講就是一個堆結構,并且有以下特點:
大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
綜上,堆排序的基本思想就是將待排序的序列構建成一個大頂堆,此時整個序列最大值就是堆頂的根節(jié)點。將其與末尾元素交換,此時末尾元素就成為最大值。然后將剩余n-1個元素重新構造成一個堆,這樣會得到n個元素中的次小值,也就是n-1個元素中的最大值,并將其放置末尾,并如此反復,就能得到一個有序序列。
實現步驟
步驟一:構造初始堆,將給定無序序列構造成一個大頂堆
假定無序序列結構如下
此時從最后一個非葉子節(jié)點[6]開始,葉結點不用調整,從左至右,從上至下進行調整。
找到第二個非葉子節(jié)點[4],由于{4,8,9}中9元素最大,4和9交換。
此時,交換導致了子樹{4,5,6}結構混亂,繼續(xù)調整,現在6元素最大,交換4和6
步驟二:將堆頂元素與末尾元素進行交換,使末尾元素最大,然后繼續(xù)調整堆,再將堆頂元素與末尾元素交換,如此反復重建和交換。
將堆頂元素9和末尾元素4進行交換
重新調整結構,使其繼續(xù)滿足堆定義
再將堆頂元素8與末尾元素5進行交換,得到第二大元素8
后續(xù)過程,繼續(xù)進行調整,交換,如此反復調整,最終即可整個序列有序。
堆排序算法的基本思路總結:
- 將無序序列建成一個堆,根據升降序需求選擇大頂堆和小頂堆。
- 將堆頂元素與末尾元素交換,將最大元素沉到數組末端。
- 重新調整,使其重新滿足堆定義,然后繼續(xù)交換堆頂元素和當前末尾元素,反復執(zhí)行調整和交換,直至整個序列有序。
代碼實現
public static void heapSort(int[] array) {//從倒數第一個非葉子節(jié)點開始for (int i = array.length/2 - 1; i>=0; i--){//從第一天非葉子節(jié)點從下至上,從左至右調整結構adjustHeap(array,i, array.length);}//將堆頂元素與末尾元素交換 將最大元素沉到數組末尾 + 重新調整堆結構for (int i = array.length - 1; i > 0 ; i--){//交換堆頂元素和末尾元素swap(array,0,i);//交換后的末尾元素忽略(j--) 不再參與堆結構的調整//重新調整堆結構adjustHeap(array,0,i);}}private static void swap(int[] array, int start, int end) {int temp = array[start];array[start] = array[end];array[end] = temp; }public static void adjustHeap(int[] array,int index,int length) {//取出當前元素int temp = array[index];//i節(jié)點是index節(jié)點的左子節(jié)點for (int i = 2 * index + 1; i < length; i = 2 * i + 1){//表明左子節(jié)點小于右子節(jié)點if (i+1 < length && array[i] < array[i+1]){//將指針移至較大節(jié)點i++;}//如果子節(jié)點大于父節(jié)點if (array[i] > temp){//將較大值賦給當前節(jié)點array[index] = array[i];//指針移向子節(jié)點index = i;}else{break;}}//循環(huán)結束,已經將最大值放在了堆頂//將temp值放到最終的位置array[index] = temp;}public static void main(String[] args) {//升序int[] array = {4,6,8,78,13,19,1,5,9,};System.out.println("排序前=>"+ Arrays.toString(array));heapSort(array);System.out.println("排序后=>"+Arrays.toString(array)); }輸出結果
排序前=>[4, 6, 8, 78, 13, 19, 1, 5, 9] 排序后=>[1, 4, 5, 6, 8, 9, 13, 19, 78]以上。
如有不足或錯誤歡迎評論指正。
總結
以上是生活随笔為你收集整理的Java实现堆排序及详细图解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现前中后序线索化二叉树以及遍历
- 下一篇: java gc种类_Java GC系列(