堆排序算法分析与实现

最大堆的性质:

A[i]>=A[2*i] && A[i] >=A[2*i+1] i=1,2,…n/2
满足这种关系的二叉树就叫做最大堆。

利用最大堆实现排序的原理

最大的特点是根节点的值是所有节点中值最大的节点。利用这个特点就可以通过不断将根节点交换到尾部的有序数组内就可以实现堆排序。
1.构建最大堆
2.将根节点与未排序部分的最后一个元素交换
3.调整堆,使得堆重新变为最大堆

时间复杂度

调整最大堆的函数AdjustHeap的复杂度是log(n)
通过交换堆的最大值到尾部的来构造有序数组的操作的复杂度是n
所以堆排序的时间复杂度是:n*log(n)

代码实现:

public class HeapSortDemo {
    private static int HeapSize;
    public static void main(String[] args) {
           int A[] = new int[]{1,2 ,3,4,7,8,9,10,14,16};
           heapSort(A);
           for (int i : A) {
            System.out.println(i);
        }
    }
    public static void heapSort(int x[]){
        HeapSize=x.length;
        buildMaxHeap(x);
        for (int i : x) {
            System.out.println("build:"+i);
        }
        int tmp;
        for(int i=x.length-1;i>0;--i){
            tmp=x[i];
            x[i]=x[0];
            x[0]=tmp;
            HeapSize--;
            AdjustHeap(x,0);
        }
    }
    public static void buildMaxHeap(int[] x) {
        // n/2+1... n-1之间到叶节点不需要调整
        //从叶节点开始自底向上构造最大堆
        for (int i = x.length / 2-1; i >= 0; --i) {
            AdjustHeap(x, i);
        }
    }

    //调整以x[i]为根节点的树
    public static void AdjustHeap(int[] x, int i) {
        i++;
        int l = i * 2 ;
        int r = i * 2+ 1;
        l--;
        r--;
        i--;
        int largest = i;
        if (r < HeapSize && x[r] > x[largest]) {
            largest = r;
        }
        if (l < HeapSize && x[l] > x[largest]) {
            largest = l;
        }
        if(largest!=i){
            int tmp = x[i];
            x[i] = x[largest];
            x[largest] = tmp;
            AdjustHeap(x,largest);
        }
    }
}

转载于:https://www.cnblogs.com/infoflow/p/7535859.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值