1. 程式人生 > >排序算法(二)選擇排序---堆排序

排序算法(二)選擇排序---堆排序

print 大於 void 破壞 clas args 進行 dex 一個

 概念:利用樹結構進行排序。

 分類:1、大頂堆: 每個小樹的根節點都大於子節點   升序排序使用大頂堆

    2、小頂堆:每個小樹的子節點都大於根節點   降序排序使用小頂堆

 

 1 public class HeapSort {
 2     
 3     public static void main(String[] args){
 4         int[] arr=new int[]{9,6,7,0,1,10,4,2};
 5         System.out.println(Arrays.toString(arr));
 6         heapSort(arr);
7 System.out.println(Arrays.toString(arr)); 8 } 9 10 public static void heapSort(int[] arr){ 11 //開始位置是最後一個非葉子節點,即最後一個節點的父節點 12 int start=(arr.length-1)/2; 13 //調整為大頂堆 14 for(int i=start;i>=0;i--){ 15 maxHeap(arr,arr.length,i);
16 } 17 //先把數組中的第0個和堆中最後一個數交換位置,再把前面的處理為 大頂堆 18 for(int i=arr.length-1;i>0;i--){ 19 int temp=arr[0]; 20 arr[0]=arr[i]; 21 arr[i]=temp; 22 maxHeap(arr,i,0); 23 } 24 } 25 26 // size:數組在後面依次先前遍歷 當前節點
27 public static void maxHeap(int[] arr,int size,int index){ 28 //左子節點 29 int leftNode=2*index+1; 30 //右子節點 31 int rightNode=2*index+2; 32 int max=index; 33 //和兩個子節點分別對比,找出最大的節點 34 if(leftNode<size&&arr[leftNode]>arr[max]){ 35 max=leftNode; 36 } 37 if(rightNode<size&&arr[rightNode]>arr[max]){ 38 max=rightNode; 39 } 40 //交換位置 41 if(max!=index){ 42 int temp=arr[index]; 43 arr[index]=arr[max]; 44 arr[max]=temp; 45 //交換位置以後,可能會破壞之前排好的堆,所以, 46 maxHeap(arr,size,max); 47 } 48 49 50 } 51 } 52

排序算法(二)選擇排序---堆排序