堆排序算法分析与实现


最大堆的性质:

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);
        }
    }
}
优质内容筛选与推荐>>
1、container_of()宏
2、动态代理
3、【TYVJ P1014】乘法游戏
4、JS实现全选,取消全选,正常选择
5、盒模式


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号