【算法學習】堆排序建立最大堆


本文代碼均轉自:

作者:早就戒了
來源:CSDN
原文:https://blog.csdn.net/qq_37169817/article/details/79777264
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 

 1 public class HeapSort { 
 2     public static int[] maxHeap(int[] array) { 
 3         // 1.構建大頂堆 
 4         for (int i = array.length / 2 - 1; i >= 0; i--) { 
 5             // 從第一個非葉子結點從下至上,對於數組從右至左調整結構 
 6             adjustHeap(array, i, array.length); 
 7             } 
 8         return array; 
 9         } 
10     
11     private static void adjustHeap(int[] array, int i, int length) { 
12         int parent = array[i]; 
13         for (int k = 2 * i + 1; k < length; k = k * 2 + 1) { 
14             // 2*i+1表示左節點,k = k * 2 + 1表示繼續調整子節點 
15             if (k + 1 < length && array[k] < array[k + 1]) 
16                 k = k + 1;// 找到子節點中更大的節點 
17             if (array[k] > parent) { 
18                     array[i] = array[k];// 父節點變為更大的值 
19                     i = k;// 修改i的值,使之成爲新的要調整的父節點 
20                 } else { 
21                     break;// 表示無需調整,因為是自底向上的 
22                     } 
23             } 
24         array[i] = parent;// 將temp值放到最終的位置 
25         }
26     
27     public static void main(String[] args) { 
28         int[] array = { 4, 6, 8, 5, 9 }; 
29         int[] maxHeap = maxHeap(array); 
30         for (int i : maxHeap) { 
31             System.out.print(i + " "); 
32             } 
33         } 
34     }

 

建大根堆堆思路整理:

  1.找到堆中第一個非葉子結點(N0),從它開始調整左右子樹。

    *第一個非葉子結點的下標為:length/2 -1

    *左右子樹調整過程:找到其中的較大值結點Ngreater,然后與N0值作比較,如果N0<Ngreater則將兩者交換,並繼續調整Ngreater的葉子結點(雖然是自底向上調整的,

     但是可能在某些parent下降的過程中破壞了底下子樹的大小排列規則。)如果N0>=Ngreater直接開始(退出了adjustHeap函數)調整下一個非葉子結點。

  2.通過循環調用adjustHeap將所有的非葉子幾點調整完成。

 

堆排序思路:

  1.建立初始堆后,將堆頂元素(最大值)與堆中最后一個元素交換,然后調整數組(堆)中的前n-1個元素。(即把數組末尾作為有序區)

  2.調整到堆中只剩一個元素時,排序完成。

堆排序代碼:

  

 1 public static void sort(int []arr){ 
 2     //1.構建大頂堆
 3     for(int i=arr.length/2-1;i>=0;i--){ 
 4         adjustHeap(arr,i,arr.length); 
 5         } 
 6     //2.調整堆結構+交換堆頂元素與末尾元素 
 7     for(int j=arr.length-1;j>0;j--){ 
 8         swap(arr,0,j);//將堆頂元素與末尾元素進行交換 
 9         adjustHeap(arr,0,j);//重新對堆進行調整
10         } 
11     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM