Java实现排序算法——堆排序

堆排序(Heap Sort)算法是基于选择排序思想的,其利用堆结构和二叉树的一些性质来完成数据的排序。堆排序在某些场合具有广泛的应用。

堆排序过程

一个完整的堆排序需要经过反复的两个步骤:构造堆结构和堆排序输出。

  • 构造堆结构就是把原始的无序数据按照堆结构的定义调整,将无序数据放置到一个完全二叉树中,然后由完全二叉树的下层逐渐进行父节点数据的比较,是父节点数据大于左右子节点的数据,直到所有节点都满足条件位置。
  • 堆排序输出:构造堆结构后根节点的数据即为数组数据最大值,然后将根节点数据与最后一个子节点数据交换输出根结点数据,在进行构造堆结构过程有得到一个最大值,反复交换数据与构造堆结构,最终完成所有数据排序。

代码如下:

public class HeapSort {

    public static void main(String[] args) {
        int a[]={23,15,24,36,46,37,75,66};
        heapSort(a);
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
    }

    private static void heapSort(int[] a) {
        int[] b=new int[a.length];
        if(a==null||a.length<=1)return;
        buildHeap(a);//构造堆结构
        for(int i=a.length-1;i>=1;i--){
            exchangeData(a, i, 0);
            maxHeap(a,i,0);
        }

    }

    private static void buildHeap(int[] a) {
        int half=a.length/2;
        for(int i=half;i>=0;i--){
            maxHeap(a,a.length,i);
        }

    }

    private static void maxHeap(int[] a, int length, int i) {
        int left=i*2+1;//左子树节点
        int right=i*2+2;//右子树节点
        int largest=i;

        if(left<length&&a[left]>a[i]){
            largest=left;
        }
        if(right<length&&a[right]>a[largest]){
            largest=right;
        }
        if(largest!=i){
            exchangeData(a,largest,i);//交换数据,使父节点数据大于子节点
            maxHeap(a,length,largest);//重新构造堆结构
        }

    }

    private static void exchangeData(int[] a, int index1, int index2) {
        int temp;
        temp=a[index1];
        a[index1]=a[index2];
        a[index2]=temp;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值