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);  //
        }
    }

}

结果截图:

原文地址:https://www.cnblogs.com/yuxuan-light-of-Taihu-Lake/p/14953289.html