堆排序

 

import java.util.Scanner;
import java.util.Arrays;
class Main{
    static int heap[] ;
    static int heapSize ;          //堆元素个数
    
    public static void buildMaxHeap(){    //建造最大堆
        int len = (heap.length-2)/2;
        for(int i=len;i>=0;i--)
            maxify(i);
    }
    
    public static void maxify(int start){   //最大化以start为顶点的堆
        int i = start,j = 2*i+1;
        int temp = heap[i];
        while(j<heapSize){
            if(j+1<heapSize&&heap[j]<heap[j+1])  //找左右孩子中最大的一个
                j++;
            if(temp>=heap[j])
                break;
            else{
                heap[i] = heap[j];
                i = j;
                j = j*2+1;
            }
        }
        heap[i] = temp;           //找到合适位置将heap[start]插入
    }
    
    public static void swap(int i,int j){
        int temp = heap[i];
        heap[i] = heap[j];
        heap[j] = temp;
    }
    
    public static void heapSort(){     //堆排序
        buildMaxHeap();
        for(int i=heap.length-1;i>=1;i--){
            swap(0,i);                  //将堆顶元素与最后一个值交换
            heapSize--;                 //堆大小减1
            maxify(0);                  //最大化堆顶元素
        }
    }
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        heapSize = in.nextInt();              //输入数据量
        heap = new int[heapSize];
        for(int i=0;i<heapSize;i++){
            heap[i] = (int)(Math.random()*100);    //生成随机值
        }
        System.out.println("未排序时:");
        System.out.println(Arrays.toString(heap));
        heapSort();
        System.out.println("排序后:");
        System.out.println(Arrays.toString(heap));
    }
}
posted @ 2015-05-11 23:55  杨永华  阅读(82)  评论(0编辑  收藏  举报