堆排序

目录

堆排序(不稳定):

代码实现:

思路分析:

总结:


堆排序(不稳定):

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

代码实现:

复制代码
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 时停止。此时从上往下,从左往右得到的就是升序的数据了。

总结:

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

相关推荐
Sarvartha5 小时前
final 关键字
java·开发语言
2601_952047795 小时前
单一策略深度教程:用轻易云把集成任务的报错实时推送到钉钉机器人
java·机器人·钉钉
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
程序员Sunday6 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
数据狐(Datafox)6 小时前
淘宝图片搜索 API 落地实战:基于以图搜货搭建跨境电商选品系统
java·大数据·微服务
zhangzeyuaaa7 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
谢亮_vipxieliang8 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
Escalating_xu8 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络