【算法设计与分析】(习题4.2-4.5) 冒泡排序

2023-05-16

说明:参考书目为《Computer Algorithms --- Introduction to Design and Analysis》(第三版)Sara Baase, Allen Van Gelder

部分内容参考自大工林晓惠老师的课程【算法设计与分析】讲解。林老师讲算法非常细致,让人很容易理解,推荐一波~

(如部分内容涉及侵权,请联系我删除,谢谢)

 

之前的文章请见:

【算法设计与分析】如何分析一个算法

【算法设计与分析】4.2 插入排序

本篇文章目录

冒泡排序

1. 定义

2. 排序过程示例

3.  算法代码

4. 复杂度分析

5. 正确性证明

6. 算法优化


冒泡排序

1. 定义

依次比较相邻的两个元素,若逆序则交换两个元素。每趟冒泡排序都能将子序列的最大数据元素放在最终的位置上。若一趟冒泡排序没有做任何数据交换,则说明子序列已经升序,可提前终止排序。

2. 排序过程示例

3.  算法代码

输入:数组Element[] E,大小为n(n>=0)

输出:排序后的Element[] E

void bubbleSort(Element[] E, int n)
    int numPairs;    // 待比较的数据对数量。即排除已固定位置的数据,对剩下的子序列进行排序所需比较次数
    boolean didSwitch;    // 在一趟排序中是否有数据交换:true(有)  false(没有)
    int j;
    
    numPairs = n - 1;
    didSwitch = true;
    while(didSwitch)
        didSwitch = false;
        for(j = 0; j < numPairs; j++)
            if(E[j] > E[j+1])
                E[j]与E[j+1]交换
                didSwitch = true;
        numPairs --;
    return;

4. 复杂度分析

习题4.2 (a):最坏情况是完全逆序。

假设有n个数据元素完全逆序,第一趟冒泡排序需要比较n-1次,第二趟冒泡排序需要比较n-2次,...,最后一趟冒泡排序需要比较1次,将比较次数加起来就是\sum_{i=1}^{n-1}i=\frac{n(n-1)}{2}

即,W(n)=\frac{n(n-1)}{2}

习题4.2 (b):最好情况是完全升序。只要做一趟比较,发现没有任何数据交换就停止排序,这样的比较次数只有第一趟的n-1次。

5. 正确性证明

习题4.3 (a):证明一趟冒泡排序后,数组的最后一个数据元素一定是最大的。

习题4.3 (b):证明若一趟冒泡排序无交换,则整个数组已排好序。

6. 算法优化

习题4.4 (a):证明如果某一趟排序中最后一次数据交换发生在 j 和 j+1 的位置,则数组从 j+1 到 n-1 的数据已处于最终排序后的位置上。

设某一趟排序时numpairs=k (j+1<k<=n-1),最后一次数据交换发生在 j 和 j+1 的位置,则max(E[0], E[1],..., E[j])<E[j+1]<=...<=E[k-1]<=E[k]

又因为之前的循环numpairs=n-1,n-1,...,k+1, 则E[k]<=E[k+1]<=...<=E[n-2]<=E[n-1]

从而:max(E[0], E[1],..., E[j])<E[j+1]<=...<=E[n-2]<=E[n-1],即数组中 j+1 到 n-1 的数据已处于最终排序后的位置上。

习题4.4 (b):修改代码,如果某一趟排序中最后一次数据交换发生在 j 和 j+1 的位置,那么下一趟排序可以在 j+1 的位置提前结束。

void bubbleSort(Element[] E, int n)
    int numPairs, lastSwitch;
    boolean didSwitch;
    int j;
    
    numPairs = n - 1;
    didSwitch = true;
    while(didSwitch)
        didSwitch = false;
        for(j = 0; j < numPairs; j++)
            if(E[j] > E[j+1])
                E[j]与E[j+1]交换
                didSwitch = true;
                lastSwitch = j;    // 记录最后一次数据交换的位置
        numPairs = j;    // 使下一趟排序可以在 j+1 的位置提前结束
    return;

习题4.4 (c):这个改变会对算法的最坏情况有影响吗?

没有影响。因为算法的最坏情况是完全逆序,每一趟冒泡排序都需要不停地交换数据直到当前子序列的最后一个数据元素,即不存在某个子序列的尾部有升序的情况。

 

习题4.5:参考习题4.4的改进方案——优化子序列尾部的排序,能否对子序列的头部也进行算法优化?

习题4.4指的是如果最后一次数据交换发生在数组 j 和 j+1 的位置,那么下一趟排序可以在 j+1的位置提前结束;同理,如果首次数据交换发生在 j 和 j+1 的位置,那么下一趟排序应该从 j-1 的位置开始。

void bubbleSort(Element[] E, int n)
    int numPairs, lastSwitch, firstSwitch;
    boolean didSwitch, didFirstSwitch;
    int j;
    
    numPairs = n - 1;
    firstSwitch = 0;
    didSwitch = true;
    while(didSwitch)
        didSwitch = false;
        didFirstSwitch = false;
        for(j = firstSwitch; j < numPairs; j++)    // 从上一趟排序初次进行数据交换的位置开始排序
            if(E[j] > E[j+1])
                E[j]与E[j+1]交换
                didSwitch = true;
                lastSwitch = j;
                if(!didFirstSwitch)
                    if(j == 0)
                        firstSwitch = 0;    // 如果第一个数据就发生交换,那么首次交换位置记为0
                    else
                        firstSwitch = j-1;    // 记录该趟排序第一次数据交换的位置
                    didFirstSwitch = true;
        numPairs = j;
    return;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法设计与分析】(习题4.2-4.5) 冒泡排序 的相关文章

  • 彻头彻尾理解JVM系列之八:Java代码是如何被CPU狂飙起来的?

    大家好 我是慕枫 前阿里巴巴高级工程师 InfoQ签约作者 阿里云专家博主 一直致力于用大白话讲解技术知识 在这里和大家分享一线互联网大厂面试经验 技术人成长路线以及Java技术 分布式 高并发 架构设计方面的经验总结 感恩遇见 希望我们都
  • 最优控制理论(一)基本概念

    1 概念 在军事 航空航天 导航制导 生产 经济活动以及人类其他有目的的活动中 xff0c 常需要对被控系统 被控过程施加某种控制作用 xff0c 使某个性能指标达到最优 xff0c 这种控制作用称为最优控制 使控制系统的性能指标实现最优化
  • ROS学习笔记--cv_bridge

    cv bridge是在ROS图像消息和OpenCV图像之间进行转换的一个功能包 一 xff09 在ROS图像和OpenCV图像之间转换 xff08 C 43 43 xff09 xff11 xff0e Concepts xff08 概念 xf
  • stm32+esp8266+onenet (MQTT)

    使用stm32采集温湿度 MQ2的数值用过 esp8266 43 mqtT协议把数据传输给onenet平台 并且能通过onenet下发指令控制led灯的亮灭 打开onenet平台 xff0c 使用旧版MQTT协议 xff0c 选择多协议接入
  • Hadoop The Definitive Guide:Hadoop权威指南-PART 1

    简介 xff1a Hadoop起源于Nutch 当人们试图构建一个开源网络搜索引擎 xff0c 但在管理在少数计算机上运行的计算时遇到了麻烦 后来Google发表了GFS和MapReduce相关介绍 xff0c 路线就变得清晰了 他们设计了
  • 【计算机图形学】绘制一个基于GDI的图形程序

    这学期选修了计算机图形学这门课 xff0c 该合集用来记录课程所学知识 概念类的内容来自于百度文库 xff1a https wenku baidu com view c3c5b36048d7c1c708a145a2 html 概念介绍 GD
  • Ubuntu 18.04 安装无人机开发环境 PX4+ROS+Gazebo

    Ubuntu 18 04 安装无人机开发环境 PX4 43 ROS 43 Gazebo 本教程基于纯净的Ubuntu 18 04 配置上述环境 由于国内网络环境问题 xff0c 无法正常从github下载文件的请用代理 代理网站 xff1a
  • docker命令详解及参数作用

    下载镜像 docker pull 镜像名 标签 查看本地镜像 docker images 删除镜像 xff1a docker rmi 镜像名 标签 启动容器 docker run d name 61 mynginx resrart 61 a
  • Mac sourcetree连接gitee码云仓库

    一 复制自己的ssh key 添加到gitee的ssh 共钥中 二 添加后 xff0c 在终端输入 ssh T git 64 gitee com gt gt 出现下面的successfully就代表关联成功了 三 sourcetree中选择
  • 路径规划与避障算法(一)---DWA算法概述

    版权声明 xff1a 本文为博主原创文章 xff0c 转载请联系博主 https mp csdn net mdeditor 82764989 DWA 动态窗口算法 算法概述 算法原理可见 https blog csdn net heyiji
  • 路径规划与避障算法(七)---DWA算法流程之三---碰撞检测评价函数

    版权声明 xff1a 本文为博主原创文章 xff0c 原创不易 转载请联系博主 本篇博客主要介绍DWA算法所采用的评价函数中障碍物相关的评价函数 评价函数 轨迹主要依据以下三条准则进行评分 综合评分后选取分数最小的路径作为下一时刻选择路径
  • 彻头彻尾理解JVM系列之九:不会JVM调优怎么进互联网大厂

    大家好 我是慕枫 前阿里巴巴高级工程师 InfoQ签约作者 阿里云专家博主 一直致力于用大白话讲解技术知识 在这里和大家分享一线互联网大厂面试经验 技术人成长路线以及Java技术 分布式 高并发 架构设计方面的经验总结 感恩遇见 希望我们都
  • CVPR代码和论文链接目录大全

    最新 xff01 CVPR 2021 语义分割论文大盘点 xff08 39篇论文 xff09 xff1a https blog csdn net amusi1994 article details 118426626 CVPR代码和论文链接
  • Ubuntu 桌面被删除,恢复

    step1 在桌面上打开终端 xff0c cd 到自己的home文件夹 step2 ls la 出现隐藏的文件及文件夹 step3 找到 config文件夹中的user dirs dirs 如图 图是找的图片 将最后vim user dir
  • 在Linux中编译带有自己编写的头文件的C程序

    有三个文件callback c xff0c callback h xff0c demo c 其中callback h是自己编写的头文件 在Linux中编译运行demo c的时候注意也要编译callback c文件 xff0c 否则会报错 引
  • Anaconda和TensorFlow开发环境搭建

    参考链接 xff08 MOOC大学 深度学习应用开发 TensorFlow实践 第二讲 xff09 xff1a https www icourse163 org course ZUCC 1206146808 一 Anaconda下载 官网下
  • 【wxPython导入失败】Failed building wheel for wxPython

    导入包wxPython失败 xff1a Failed building wheel for wxPython 错误原因 xff1a 根据错误提示发现我的电脑上有两个版本的Python xff0c 一个是最开始学Pyhton的时候装的3 7版
  • 【PEP 484】什么是.pyi文件?

    在PyCharm中查看源代码的时候 xff0c 发现有些代码行有星号 标识 xff0c 鼠标移上去会提示在某个 pyi文件中有其存根程序 xff0c 点击星号会跳转到对应的存根程序处 那什么是存根程序呢 xff1f 我第一次看到这个概念是在
  • 【timeout error】导入手写体识别数据(MNIST)超时

    问题起因 xff1a 想要用TensorFlow做手写体识别 xff0c 在导入数据的时候出现了超时的问题 解决方法 xff1a C Users Desny Anaconda3 pkgs tensorflow 1 2 1 py35 0 Li
  • 【深度学习】如何计算AP(平均精度)和mAP(平均精度均值)?

    起因 xff1a 最近导师给买了本书 xff0c 叫做 智能计算系统 xff08 陈云霁等人编著 xff09 xff0c 让我上b站看看教材对应的视频 不得不说这书写的确实不错 xff0c b站上的视频讲的也还可以 书和视频的内容可以相互补

随机推荐