前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >堆排序

堆排序

作者头像
用户6055494
发布2019-10-10 17:13:06
3700
发布2019-10-10 17:13:06
举报
文章被收录于专栏:AVAJAVAJ

堆排序

  1. 采用数据来构建堆,根据堆的特性,及左右子节点和父节点的位置位置关系。
  2. 左子节点下标 = 2 * 父节点下标 + 1、右子节点下标 = 2 * 父节点下标 + 2。
  3. 这里采用数组来模拟堆,具体的逻辑就是每次构建一个最大堆 然后将根节点与最后。
  4. 一个节点互换,排除最后元素再次构建最大堆,一直到最后一个元素 这样就排好序啦。

代码:

代码语言:javascript
复制
public static void heapSort(int [] arr) {
    for(int i = 0; i < arr.length; i++) {
        // 每次建堆都能找出最大的一个元素,并将它与最后一个元素交换
        // 同时排除最后一个元素,这样就定位了一个元素的位置,以此类推
        maxHeap(arr, arr.length - i);
        swap(arr,0,arr.length - i - 1);
    }
}
// 从数组的最后一个元素开始构建
public static void maxHeap(int[] arr,int size) {
    // 从数组末尾开始构建(没有子节点的话也就不需要构建 所以这里从size/2开始构建),直到第一个元素
    // 这样才保证构建出来的大根堆的根节点就是最大的
    for(int i = size / 2; i >= 0; i--) {
        buildHeap(arr, i, size);
    }
}


// 建堆
public static void buildHeap(int[] arr,int currendRootNode,int size) {
    if(currendRootNode < size) {
        // 左孩子
        int left=currendRootNode * 2 + 1;
        // 右孩子
        int right=currendRootNode * 2 + 2;

        // 将当前节点看成是最大的节点
        int max = currendRootNode;

        if(left < size) {
            // 如果左孩子比根元素要大,记录其位置
            if(arr[left] > arr[max]) {
                max = left;
            }
        }

        if(right < size) {
            // 如果右孩子比根元素要大,记录其位置
            if(arr[right] > arr[max]) {
                max = right;
            }
        }

        // 如果最大的不是根元素,那么就交换
        if(max!=currendRootNode) {
            swap(arr,max,currendRootNode);
            // 继续往下比较
            buildHeap(arr,max,size);
        }
    }
}

public static void swap(int[] arr,int x,int y) {
    int temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}

今天Jacky真好看

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员面试鸭 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档