冒泡排序详解(Bubble Sort)

news2024/11/27 17:50:49
本文已收录于专栏
《算法合集》

目录

  • 一、简单释义
    • 1、算法概念
    • 2、算法目的
    • 3、算法思想
    • 4、算法性质
  • 二、核心思想
    • 构建
    • 排序
  • 三、图形展示
    • 宏观展示
    • 微观展示
  • 四、算法实现
    • 实现思路
    • 代码实现
      • 客户端调用
      • 构造堆的方法
      • 元素交换的方法
      • 元素比较的方法
    • 运行结果
  • 五、算法描述
    • 1、问题描述
    • 2、算法过程
    • 3、算法总结
  • 六、算法分析
    • 1、时间复杂度
    • 2、空间复杂度
    • 3、算法稳定性


一、简单释义

1、算法概念

  堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

2、算法目的

  把无序数组通过转换成的形式,通过堆的各个结点比较进行交换位置,最后形成一个有序数组  (文中以大根堆为例)

3、算法思想

  将待排序的序列构造成一个大根堆 或小根堆(文中以大根堆为例),然后将堆顶元素与最后一个元素交换位置 ,再将剩余元素重新构造成一个堆,重复执行以上操作,直到整个序列有序。

4、算法性质

以大根堆为例,它总是满足下列性质:

  1. 空堆是一个大根堆
  2. 大根堆中某个结点的关键字小于等于其父结点的关键字;
  3. 大根堆是一个完全二叉树

二、核心思想

构建

  构造堆的过程就是将无序的序列构造成一个堆的过程。

排序

  将堆顶元素与最后一个元素交换位置,然后将剩余元素重新构造成一个堆的过程。

三、图形展示

宏观展示

在这里插入图片描述

微观展示

  以4、6、3、5、9这个数组为例,根据数组构建二叉堆。
在这里插入图片描述
  1、第一次排序:从叶子结点往上进行比较,首先是5和6比较,5小于6不交换位置。然后9和6进行比较,9大于6交换位置。
在这里插入图片描述
  2、第二次排序:9和4进行对比,9大于4交换位置。然后6和4进行比较,6大于4交换位置。最终的到一个最大值9。9和4交换位置继续排序。
在这里插入图片描述

  3、第三次排序:重复上述操作。
在这里插入图片描述
  4、第四次排序
在这里插入图片描述
  5、第五次排序
在这里插入图片描述

四、算法实现

实现思路

  将图形化展示的过程转换成对应的开发语言,本文中主要以Java语言为例来进行算法的实现。

  1、首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端
  2、将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1
  3、将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,反复执行,便能得到有序数组

  能把整个过程描述清楚实现起来才会更加容易!!!

代码实现

客户端调用

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.Algorithm.HeapSort
 * @Author: Wuzilong
 * @Description: 堆排序
 * @CreateTime: 2023-05-22 11:45
 * @Version: 1.0
 */

public class HeapSort {

    public static void main(String[] args) {
        int[] numArray={4,6,3,5,9};
        heapSort(numArray);

    }
}

构造堆的方法

	//构造堆的方法
    public static void heapSort(int[] arr) {
        int n = arr.length;

        // 构造大根堆
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }

        // 交换堆顶元素和最后一个元素,并重新构造堆
        for (int i = n - 1; i >= 0; i--) {
            swap(arr, 0, i);
            heapify(arr, i, 0);
            System.out.println( Arrays.toString(arr));
        }
    }

元素交换的方法

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

元素比较的方法

    private static void heapify(int[] arr, int n, int i) {
        int largest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;

        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }
        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }
        if (largest != i) {
            swap(arr, i, largest);
            heapify(arr, n, largest);
        }

    }

运行结果

在这里插入图片描述

五、算法描述

1、问题描述

  通过给定的数据集合,创建堆。可以先创建堆数组的内存空间。然后一个一个执行堆的插入操作。

2、算法过程

整个算法过程分为以下几步:
  1)将待排序序列构造成一个大根堆或小根堆。
  2)将堆顶元素与最后一个元素交换位置,堆的大小减一。
  3)对剩余元素重新构造成一个堆。
  4)重复执行步骤 2 和步骤 3,直到整个序列有序。

3、算法总结

  构造的过程就是将无序的序列构造成一个堆的过程。堆的定义是:对于任意一个非叶子节点 i,其左子节点为 2i+1,右子节点为 2i+2,且父节点的值大于等于(或小于等于)其子节点的值。因此,我们可以从最后一个非叶子节点开始,依次将其与其子节点比较,如果不满足堆的定义,则交换位置,直到整个序列构造成一个堆为止。
  排序的过程就是将堆顶元素与最后一个元素交换位置,然后将剩余元素重新构造成一个堆的过程。每次交换后,堆的大小减一,因此我们可以通过一个变量来记录堆的大小,从而将排序的过程限制在堆的范围内。

六、算法分析

1、时间复杂度

  堆排序是一种基于二叉堆的排序算法,其时间复杂度:最好、最坏和平均均为 O(nlogn)

2、空间复杂度

  堆排序是一种原地排序算法,所以空间复杂度为 O(1)。

3、算法稳定性

  堆排序是一种不稳定的排序算法。在堆排序过程中,由于交换堆顶元素和最后一个元素的位置可能会改变相同元素之间的相对顺序,所以堆排序不是稳定的排序算法。


🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

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

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

相关文章

数据库管理-第七十八期 记第一次数据库吐槽大会(20230530)

数据库管理 2023-05-30 第七十八期 记第一次数据库吐槽大会1 主席2 三六九等3 数据库吐槽大会总结 第七十八期 记第一次数据库吐槽大会 昨天晚上终于还是把Exadata X9M-2和之前用于展示RAC搭建及升级的那套库做好了ADG&#xff0c;这部分操作在整理后会在下个月发出来。因为之…

Python列表类型的使用

文章目录 Python中的列表类型一、列表的常用操作二、列表的增删改查三、列表常用的函数 Python中的列表类型 将各个元素用方括号&#xff08;[]&#xff09;括起来&#xff0c;用逗号&#xff08;,&#xff09;分隔开&#xff0c;这种形式的数据类型就是列表。各个元素的数据类…

HNU-电子测试平台与工具2-串口实验5次

计算机串口使用与测量 【实验属于电子测试平台与工具】 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 0.环境搭建 在实验开始之前,安装好Ubuntu 20.04操作系统。(这个没有难度) 但要提醒的是,这个ubuntu是xubuntu,而且虚拟硬盘只有10GB的大小…

智警杯1.4---excel可视化

视频要点&#xff1a; 首先就是有数据透视表 点击数据透视表&#xff0c;分析&#xff0c;字段项目&#xff0c; 切片器筛选 切片器&#xff08;我希望用什么对数据进行一个筛选&#xff09; 跟下拉列表有点像&#xff0c;只不过切片器仅仅之对于数据透视表 依旧需要用su…

HBase集群搭建

hbase 1.解压HBase安装包 先 下载HBase压缩包&#xff0c;并解压安装文件&#xff0c;示例代码如下&#xff1a; tar -zxvf hbase-2.0.1-bin.tar.gz2. 修改配置文件 编辑 conf目录下的 hbase-env.sh文件&#xff0c;示例代码如下&#xff1a; cd conf vi hbase-env.sh添加…

压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法

压缩感知系列博客&#xff1a;压缩感知入门①从零开始压缩感知压缩感知入门②信号的稀疏表示和约束等距性压缩感知入门③基于ADMM的全变分正则化的压缩感知重构算法 文章目录 1. Problem2. 仿真结果3. MATLAB算法4. 源码地址参考文献 1. Problem 信号压缩是是目前信息处理领域非…

Frame Pacing

Frame Pacing是每个游戏都要遇到的问题&#xff0c;这里面有很多细节值得探讨。 为什么需要做Frame Pacing&#xff1f; 从我们的游戏线程渲染一帧到最终屏幕上绘制出一帧不是一个概念&#xff0c;这种间会经历CPU&#xff0c;GPU&#xff0c;屏幕合成器等多个角色的协同工作&a…

【xv6操作系统】安装、运行与调试

一、构建、装入过程 1.编写“启动代码主体代码”&#xff08;在下载的xv6的原始代码上进行修改&#xff09; 2.源代码进行编译、链接生成系统镜像&#xff08;elf格式的目标文件&#xff09; 3.将系统镜像保存起来&#xff08;如保存到磁盘、flash或者网络服务器上&#xff…

上海斯歌K2 x 赛博威 | 战略合作深度交流暨签约仪式

2月16日&#xff0c;上海斯歌K2与赛博威进行了战略合作深度交流&#xff0c;并在赛博威广州科学城办公室举办战略合作签约仪式。 为满足客户在数智化建设过程中的多元化需求&#xff0c;上海斯歌K2与赛博威曾多次产生交集。凭借双方多年合作的良好基础&#xff0c;自2022年始&a…

【C++】右值引用和移动语义(详细解析)

文章目录 1.左值引用和右值引用左值引用右值引用 2.左值引用和右值引用的比较左值引用总结右值引用总结 3.右值引用的使用场景和意义知识点1知识点2知识点3知识点4总结 4.完美转发万能引用见识完美转发的使用完美转发的使用场景 1.左值引用和右值引用 传统的C语法中就有引用的…

【C++】引用 - 基本语法,注意事项,函数参数,函数返回值,本质

文章目录 1. 引用的基本语法2. 引用的注意事项3. 引用做函数参数4. 引用做函数返回值5. 引用的本质6. 常量引用 1. 引用的基本语法 作用是&#xff1a;给变量起别名 语法&#xff1a;数据类型 &别名 原名 2. 引用的注意事项 引用必须初始化引用在初始化后&#xff0c;不…

量子计算:基本概念

选了课程 《量子计算与量子信息》&#xff0c;没学过量子力学的博主实在是听不懂啊 (ㄒoㄒ) 简略整理了下 可能大概也许 明白一二都没有 的课程最开始两节的内容&#xff0c;如有错误欢迎指出 ~ ~ ~ 文章目录 矩阵论复空间中的矩阵矩阵上的运算 量子力学量子态基本假设 量子计算…

阿里云的内容识别技术可以实现哪些场景下的智能化应用?

阿里云的内容识别技术可以实现哪些场景下的智能化应用&#xff1f; [本文由阿里云代理商[聚搜云]撰写]   随着人工智能技术的快速发展&#xff0c;阿里云借助自身的技术和资源优势&#xff0c;开发了一种名为“内容识别”的技术。这项技术能够高效、准确地识别出图片、视频、…

有个规划文档,会让软件开发更有效

有个规划文档&#xff0c;会让软件开发更有效 中小企业&#xff0c;业务部门不太清楚软件生产过程 软件生产有一定的抽象和复杂性 要形成一个共识 趣讲大白话&#xff1a;要有点整体观 【趣讲信息科技181期】 **************************** 2019年整理出了一个目录框架 用在很多…

windows的cmd命令窗口介绍

1.打开cmd 1.1.方式一 左下角搜索&#xff1a;“运行” -> 打开 输入"cmd" -> 确定 1.2.方式二 直接使用快捷键 windows r 即可打开 然后输入cmd&#xff0c;点击确认 1.3.方式三 打开文件管理器&#xff0c;输入cmd&#xff0c;回车 即可在该文件路径下…

统计软件与数据分析Lesson16----pytorch基本知识及模型构建

统计软件与数据分析Lesson16----pytorch基本知识及模型构建 0.上节回顾0.1 一元线性回归数据生成数据处理初始数据可视化 0.2 梯度下降Gradient DescentStep 0: 随机初始化 Random InitializationStep 1: 计算模型预测值 Compute Models PredictionsStep 2: 计算损失 Compute t…

让进程能够“相互沟通”的高级方式一:匿名管道

代码运行及测试环境&#xff1a;linux centos7.6 在阅读这篇文章时&#xff0c;需要掌握OS对文件管理的基础知识&#xff08;文件打开表、文件描述符、索引结点…&#xff09; 前言 我们都知道进程是具有独立性的&#xff0c;意味着进程之间无法相互通信。但在一些情况下&…

当我们谈笔记的时候,我们在谈什么

文章具体内容如图&#xff0c;感谢妙友分享好文&#x1f389; 本篇内容来源于网站Untag Minja 上传的内容《当我们谈笔记的时候&#xff0c;我们在谈什么》 如有侵权请联系删除&#xff01;

如何搭建与使用FTP服务器

一、概述 目前用作搭建FTP服务器端的软件有很多&#xff0c;比如 Vsftpd、ProFTPD、PureFTPd、Wuftpd、ServerU、Filezilla Server等&#xff0c;这里使用Vsftpd进行搭建。 vsftpd 是“very secure ftp daemon”的首字母缩写&#xff0c;它是一款在Linux发行版中最受推崇的免…

应用到vscode

随着ChatGPT的热度持续上升&#xff0c;我们也不得不深刻认识到&#xff0c;这已经势不可挡了。我们必须去接受它&#xff0c;甚至是拥抱它。 私信我可以获取最新包 今天呢&#xff0c;我们要介绍的是vscode的一款插件&#xff0c;叫做ChatGPT&#xff1a; 使用方式 安装完成…