堆排序

目录

堆排序(不稳定):

代码实现:

思路分析:

总结:


堆排序(不稳定):

如果想要一段数据从小到大进行排序,则要先建立大根堆,因为这样每次堆顶上都能取到数据中最大的,可以交换到一段数据最后面。

代码实现:

复制代码
public static void heapSort(int[] arr) {
        createHeap(arr);
        int end = arr.length - 1;
        while(end > 0) {
            swap(arr,0,end);
            siftDown(arr,0,end);
            end--;
        }
    }

    //建立大根堆
    public static void createHeap(int[] arr) {
        for (int i = (arr.length-1-1) / 2; i >= 0 ; i--) {
            siftDown(arr,i, arr.length);
        }
    }

    //向下调整
    private static void siftDown(int[] arr,int parent, int k) {
        int child = 2 * parent + 1;
        while(child < k) {
            if(child + 1 < k && arr[child + 1] > arr[child]) {
                child++;
            }
            if(arr[child] > arr[parent]) {
                //交换
                swap(arr,parent,child);
                parent = child;
                child = 2 * parent + 1;
            }else {
                break;
            }
        }
    }

    private static void swap(int[] arr,int i,int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

思路分析:

红色代表数组下标。

首先,想要从小到大排序,在堆排序开始之前,先对数据建立一个大根堆,之后,交换0下标和数据末尾的值,这样最后一个下标的值得到的是该段数据中最大的值了,再从0下标位置开始向下调整这个堆,以此往复,当 end 为 0 时停止。此时从上往下,从左往右得到的就是升序的数据了。

总结:

排升序要建大堆,排降序建小堆。

相关推荐
朝新_1 分钟前
【多线程初阶】阻塞队列 & 生产者消费者模型
java·开发语言·javaee
立莹Sir4 分钟前
Calendar类日期设置进位问题
java·开发语言
木子.李3471 小时前
排序算法总结(C++)
c++·算法·排序算法
风逸hhh1 小时前
python打卡day46@浙大疏锦行
开发语言·python
火兮明兮1 小时前
Python训练第四十三天
开发语言·python
季鸢2 小时前
Java设计模式之状态模式详解
java·设计模式·状态模式
闪电麦坤952 小时前
数据结构:递归的种类(Types of Recursion)
数据结构·算法
@yanyu6662 小时前
springboot实现查询学生
java·spring boot·后端
ascarl20102 小时前
准确--k8s cgroup问题排查
java·开发语言
magic 2452 小时前
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
java