天天看點

java堆排序

直接貼源代碼:

package com.java.fmd;

import java.util.Scanner;

public class HeapSort {
    int[] arr;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int n=0;
        System.out.println("請輸入長度:");
        n=sc.nextInt();
        
        HeapSort heapSor = new HeapSort();
        int[] arr = new int[n+1];  //0下标放的是數組長度,
        arr[0]=n;
        System.out.println("請輸入相應個數的數字:");
        for(int i=1;i<=n;i++) {    
            arr[i]=sc.nextInt();
        }
        heapSor.arr = arr;
        heapSor.heapSort(arr);
        System.out.println("排序結果為:");
        for(int i=1;i<arr.length;i++)
            System.out.print(arr[i]+" ");
    }
    void heapAdjust(int[] arr,int s,int m){
        //已知arr[s...m]中記錄的關鍵字除arr[s]之外均滿足堆的定義,本函數調整arr[s]的關鍵字,使arr[s...m]成為一個最大堆
        int rc = arr[s]; //s是最後一個非葉子節點
         
        for(int j=2*s;j <= m;j = s*2){
            if(j<m && arr[j]<arr[j+1])
                j++;  //j為key較大的下标
            if(rc >= arr[j]) break;
             arr[s] = arr[j];  //上移到父節點
             s=j;
        }
        arr[s]=rc;  //要放入的位置
         
    }
     
    void heapSort(int[] arr){
        //對數組進行建堆操作,就是從最後一個非葉結點進行篩選的過程
        for(int i=(arr.length-1)/2;i > 0;i--){//因為0沒有使用,是以length-1
            heapAdjust(arr,i,arr.length-1); 
        }
         
        outputArr(1);
        for(int i=arr.length-1; i>1; i--){
            int temp = arr[1];
            arr[1] = arr[i];
            arr[i] = temp;
            heapAdjust(arr,1,i-1);
        }
    }
    void outputArr(int i){
         
        if(i <= arr[0]){
            //System.out.println(arr[i]);
            outputArr(i*2);  //左
            outputArr(i*2+1);  //右
        }
    }

}      

結果截圖:

java堆排序
上一篇: 每日學習
下一篇: 每日學習