堆排序

package sort;

import java.util.Scanner;

public class HeapSort {
    public static int arr[];
    static{
        System.out.println("Please enter the array to sort, and use ',' as a separator:");
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        String n[]=s.split(",");
        arr=new int[n.length];
        System.out.println("Before sort:");
        for(int i=0;i<arr.length;i++){
            arr[i]=Integer.parseInt(n[i]);
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
    public static void main(String args[]){
        int m=arr.length-1;
        heapSort(m);
        System.out.println("After sort:");
        for(int i=0;i<=m;i++)
            System.out.print(arr[i]+" ");
        System.out.println();
    }
    public static void heapSort(int m){
        int temp=0;
        for(int i=(m+1)/2;i>=1;i--)
            createHeap(m+1,i);  //创建整个初始大根堆
        for(int i=m;i>=1;i--){  //控制范围,逐渐缩小
            createHeap(i+1,1);  //创建根堆
            temp=arr[0];
            arr[0]=arr[i];
            arr[i]=temp;
            System.out.print("Current sorting:");
            for(int k=0;k<=m;k++)
                System.out.print(arr[k]+" ");
            System.out.println();
        }
    }
    //下面的方法是创建大根堆,每运行一次,都能找到堆的根部的数据
    public static void createHeap(int m,int i){  //创建根堆
        int j=2*i;
        int temp=arr[i-1];
        while(j<=m){
            if(j<m && arr[j-1]<arr[j])  //找一个最大的数
                j++;
            if(temp<=arr[j-1]){  //判断第一个数是否比最大的数小
                arr[i-1]=arr[j-1];
                i=j;
                j=2*i;
            }
            else break;
        }
        arr[i-1]=temp;
    }

}

 

posted @ 2015-07-28 20:45  吕布布1995  阅读(102)  评论(0编辑  收藏  举报