三、详解桶排序以及排序内容大总结

news2024/11/25 10:35:21

详解桶排序以及排序内容大总结

文章目录

  • 详解桶排序以及排序内容大总结
      • 堆的操作(大)
        • heapinsert --- 调整成大根堆
        • heapify --- 移除原根节点后,继续调整成大根堆
        • 堆中某个位置的数值发生改变
    • 堆排序
      • 优化
    • 堆练习
    • 比较器
    • 桶排序
      • 基数排序

注:堆是一种特殊的二叉树

堆分为大根堆(以某一节点为根节点的整棵树中最大值为该节点)和小根堆(以某一节点为根节点的整棵树中最小值为该节点)

在这里插入图片描述

堆的操作(大)

heapinsert — 调整成大根堆

假设一个用户不断地给出数,程序拿到数字并将在此之前的所有数字调整成大根堆

  1. 找父节点(i-1)/2进行比较,比父节点大则交换位置

代码实现:

 /**
     * 调整过程:某个数正处在index的位置,不断往上调整位置时
     *
     * 新节点比自己的父节点大,位置需要置换
     * 置换以后新节点处于父节点位置,下标需要改变
     * @param arr
     * @param index
     */
    public static void heapInsert(int[]arr,int index){
         //while停止条件:
            //1:来到了一个合适的位置,比自己的父亲节点小,不需要再调整
            //2:来到了根节点,根节点下标为0,(0-1)/2==0,自己不会比自己大,while停止
        while(arr[index] > arr[(index-1)/2]){
            //置换
            swap(arr,index,(index-1)/2);
            //改变该节点位置
            index = (index-1)/2;
        }
    }
heapify — 移除原根节点后,继续调整成大根堆

假设用户停止抛出数字,让程序返回在此之前的所有数中的最大值,并且将剩下的数再次调整成为大根堆

  1. 返回下标为0的数字,即为最大值
  2. 将堆中的最后一个数的位置调换到根节点的位置(用root标记),数组长度-1,开始调整
  3. 调整步骤:在root节点的左孩子和右孩子之中选择一个最大值,与root进行比较,root比较小的话则调换位置;继续上述调整步骤,知道root节点比自己的左右孩子都大,或者没有左右孩子时

代码实现:

	/**
     * 剔除最大值后,对剩下的节点调整成大根队
     * @param arr
     * @param index   初始index  可以从任何一个位置往下调整
     * @param heapSize   堆的大小
     */
    public static void heapIfy(int[] arr,int index,int heapSize){
        //左孩子下标
        int left = index*2+1;
        //左孩子下标还没有越界,证明还有孩子
        while(left<heapSize){
            //左右孩子PK
            int largest = left +1 <heapSize && arr[left+1]>arr[left]?
                    left+1:   //如果右孩子的下标没有越界 且 右孩子比左孩子大
                    left;   //反之,右孩子越界或左孩子比较大则都选左孩子

            //父节点和较大的孩子节点PK
            if (arr[largest] > arr[index]){  //孩子节点比较大
                //孩子节点与父节点交换
                swap(arr,largest,index);
                index = largest;    //此时的父节点处在孩子节点的位置
                left = index *2 +1;   //此时的父节点的左孩子位置
                
                //继续循环换位置
            }else {   //孩子节点没有比父节点大,大根堆形成
                break;
            }
        }
    }
堆中某个位置的数值发生改变
  1. 变大:往上进行heapInsert
  2. 变小:往下惊醒heapIfy

堆排序

  1. 调整成大根堆,剔除最大值(根节点),将最后一个位置上的数放到根节点上,heapSize–
  2. 继续调整,剔除,更新位置,heapSize
  3. 直到排序完成

代码实现:

     /**
     * 堆排序代码实现
     * @param arr
     */
    public static void heapSort(int[] arr){
        //arr为空或arr只有一个或零个数
        if(arr==null || arr.length<2){
            return;
        }
        //初始大根堆
        for (int i = 0;i<arr.length;i++){  //O(N)
            heapInsert(arr,i);   //O(log N)
        }
        int heapSize = arr.length;  //初始大根堆长度
        
        swap(arr,0,-heapSize);   //0位置上堆中最后的位置做交换
        //当堆的长度不为0时,需要不断拿走根节点,再重新调整
        while (heapSize > 0){    //O(N)
            heapIfy(arr,0,heapSize);    //O(log N)
            swap(arr,0,--heapSize);
        }
    }

优化

在这里插入图片描述

在这里插入图片描述

完全二叉树的叶子节点:

  1. 如果是偶数个节点,叶子节点等于总节点除以2, 即 N % 2==0, n = N/2
  2. 如果是奇数个节点,叶子节点等于==(总节点+1)除以2==, 即 N % 2 == 1, n = (N+1)/2

时间复杂度:假设数组中有N个数,叶子节点为N/2个叶子节点

  1. 最底层的叶子节点的时间复杂度即为:(N/2)*1(1为只进行一次操作,因为叶子节点没有子节点,只遍历)
  2. 倒数第二层的节点的时间复杂度:(N/4)*2(2为 遍历+往下移动一层)
  3. 倒数第三层的节点的时间复杂度:(N/8)*3(3为 遍历+往下移动2层)
  4. 以此类推

T ( N ) = N / 2 ∗ 1 + N / 4 ∗ 2 + N / 8 ∗ 3 + . . . + 1 ∗ l o g 2 N T(N)=N/2*1+N/4*2+N/8*3+...+1*log2 N T(N)=N/21+N/42+N/83+...+1log2N

错位相减2T(N)-T(N)==T(N) 结果为O(N)

代码实现:

        //更快的初始化堆的方法    时间复杂度O(N)
        for (int i = arr.length-1;i>=0;i--){
            heapIfy(arr,i, arr.length);
        }

堆练习

堆排序扩展题目
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。

题解:

每一个元素移动的距离都不超过K:意味着,在数组的 0~K 的范围内的最小值即为整个数组的最小值,K+1位置以后的数也全都不可能移动到 0 位置上。

所以,只需要 使用一个固定长度为 K+1的滑动窗口或双指针,不断的选出该范围内的最小值,然后不断地推后该滑动窗口。

Java中现成的堆结构:优先级队列

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

默认小根堆,想要大根堆则传入比较器指定比较挥着

底层是数组:

扩容机制???

默认堆结构,只支持用户给出一个数,和系统弹出最值并移除(黑盒)

比较器

public static class myCompare implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2-o1;
    }
}

桶排序

之前所有的排序都是只和两个数之间的比较有关系。(基于比较的排序)

不基于比较的排序(根据数据状况定制):

例子:员工年龄排序,返回0-200

解题思路:申请一个长度为200的数组,下标 i 认为是年龄,i 位置的值为年龄为 i 的人数。

时间复杂度:O(N)

不基于比较的排序都是根据数据状况做的排序,应用范围比基于比较的排序小。

基数排序

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1265291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mongodb查询数据库集合的基础命令

基础命令 启动mongo服务 mongod -f /usr/local/mongodb/mongod.conf //注意配置文件路径停止mongo服务 关闭mongodb有三种方式&#xff1a; 一种是进入mongo后通过mongo的函数关闭&#xff1b; use admin db.shutdownServer()一种是通过mongod关闭&#xff1b; mongod --s…

算法分析-寻找假币题

一.题目需求 你手里有70枚重量相等的真金硬币&#xff0c;但你知道其中有一枚是假币&#xff0c;比其他金币轻。 你有一个平衡秤&#xff0c;你可以一次在两边放上任意数量的硬币&#xff0c;它会告诉你两边是否重量相同&#xff0c;或者如果不相同&#xff0c;哪边更轻。 问题…

C语言——输入两个正整数 m 和 n。求其最大公约数和最小公倍数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int m, n;int i;int x 1;int y 0;printf("请输入两个正整数m和n&#xff1a;\n");scanf("%d,%d", &m, &n);for (i 1; i < m && i < n; i) {if (m % i 0 …

汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展

可能很多人都不知道&#xff0c;危化品爆炸、城市光化学烟雾污染&#xff08;如英国伦敦烟雾事件&#xff09;、城市灰霾、温室效应、臭氧层空洞等问题背后的元凶都是VOC。VOC(Volatile Organic Compounds)即挥发性有机物&#xff0c;这类物质易挥发&#xff0c;且普遍具有毒性…

【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)

文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…

算法通关村-----数据流的中位数

数据流的中位数 问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFin…

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据 该项目介绍了如何在 PL 中的 HDL 与 FPGA 中的处理器上运行的嵌入式 C 之间传输数据的基本结构。 介绍 鉴于机器学习和人工智能等应用的 FPGA 设计中硬件加速的兴起&#xff0c;现在是剥开几层“云雾”并讨论 HDL 之间来回传…

高校学生宿舍公寓报修维修生活管理系统 微信小程序b2529

本课题要求实现一套基于微信小程序宿舍生活管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;学生、维修员和卫检员&#xff09;四个模块等功能。 使用基于微信小程序宿舍生活管理系统相对传统宿舍生活管理系统信息管理方式具备很多优点&#xff1a;首先可以大幅…

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO&#xff0c;如下死 GPIO 2 在前端的…

【Java Spring】Spring MVC基础

文章目录 1、Spring MVC 简介2、Spring MVC 功能1.1 Spring MVC 连接功能2.2 Spring MVC 获取参数2.2.1 获取变量2.2.2 获取对象2.2.3 RequestParam重命名后端参数2.2.4 RequestBody 接收Json对象2.2.5 PathVariable从URL中获取参数 1、Spring MVC 简介 Spring Web MVC是构建于…

【计算机网络笔记】以太网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

鸿蒙开发学习——应用程序框架

文章目录 UIAbility的生命周期Create状态WindowStageCreateForeground和Background前后台展示控制onWindowStageDestroyDestory 总结 UIAbility的生命周期 感觉这里他讲的不清晰&#xff0c;UIAbility的4个声明周期是Create、Foreground&#xff08;桌面展示&#xff09;、Back…

C#-认识串口通信并使用串口助手

串口通讯(Serial Communication)&#xff0c;是指外设和计算机间&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数据的一种双向通讯方式。 串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;没有规定接口插件电缆以及使用的通信协议&#xff0…

ModbusRTU\TCP消息帧解析(C#实现报文发送与解析)

目录 知识点常用链接一、Modbus1.ModbusRTU消息帧解析2.主站poll、从站slave通讯仿真-modbusRTU1.功能码01读线圈状态2.功能码03读保持寄存器报文解析&#xff08;寄存器存整型&#xff09;报文解析&#xff08;寄存器存float&#xff09; 3.C#模拟主站Poll&#xff08;ModbusR…

P24 C++ 字符串常量

前言 本期我们讨论字符串字面量。 这是一种基于字符串的东西&#xff0c;上一章我们讲过字符串&#xff0c;你一定要去先去看看那一期的内容。 P23 C字符串-CSDN博客 01 什么是字符串字常量呢&#xff1f; 字符串字面量就是在双引号之间的一串字符 在上面的代码中&#xf…

Linux CentOS_7解决无法上网的问题

参考视频&#xff1a;保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 配置网络&#xff1a;解决上网问题 第一步&#xff1a;选择网络模式 第二步&#xff1a;配置网卡命令&#xff1a;打开终端执行命令&#xff1a; 1、先切换到根目录下&#xff0c;防止在第执行cd …

计网Lesson4 - 计算机组网模型

文章目录 计算机的连接方式1. 两台计算机的互联2. 多台计算机的互联&#xff08;旧式&#xff09;3. 多台计算机的互联 --- 集线器&#xff08;Hub&#xff09;4. 网桥5. 多台计算机的互联 --- 交换器&#xff08;Switch&#xff09; 计算机的连接方式 1. 两台计算机的互联 网…

什么是路由抖动?该如何控制

路由器在实现不间断的网络通信和连接方面发挥着重要作用&#xff0c;具有所需功能的持续可用的路由器可确保其相关子网的良好性能&#xff0c;由于网络严重依赖路由器的性能&#xff0c;因此确保您的路由器不会遇到任何问题非常重要。路由器遇到的一个严重的网络问题是路由抖动…

如何使用APP UI自动化测试提高测试效率与质量?

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…

第15关 K8s HPA:自动水平伸缩Pod,实现弹性扩展和资源优化

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维&#xff0c;这节课带来k8s的HPA 自动水平伸缩pod&#xff08; 视频后面有彩蛋 : ) &#xff09;。 我们知道&#xff0c;初始Pod的数量是可以设置的&#xff0c;同时业务也分流量高峰和低峰&a…