首页 > 其他分享 >两种常见排序(冒泡排序和选择排序)详解

两种常见排序(冒泡排序和选择排序)详解

时间:2024-07-29 22:57:24浏览次数:17  
标签:数列 最大值 假定 冒泡排序 最小值 详解 排序

一、冒泡排序

1.1、冒泡排序的原理讲解。

例如有以下7个数的无序数列储存在数组arr[7]中,现在需要用冒泡排序法来对以下序列进行排序

冒泡排序是比较相邻的两个数,如果第一个数比第二个数大,这两个数就要交换两个数的位置,如果第一个数小于第二个数则不用变换位置,例如第一个数3比5小不用变换位置,接下来看5和2,5比2大所以5和2交换位置,然后5再与4比较,5比4大,两数交换位置,再接着5与1比较,5比1大两数交换位置,再接着5与8比较5小于8所以不用交换位置,再看8和7,8比7大两数交换位置。以上是冒泡排序的第一轮排序,我们找出了这个无序数列的最大值8,第一轮排序完成后的序列如下图:

接下来开始第二轮排序,从第一个数3开始与相邻数2比较,3和2比较,3大于2两数交换位置,以此类推第二轮交换完成后排好8除外的数列最大数7,结果如下图:

第三轮交换完的结果如下图:

第四轮交换完的结果如下图

由于这次举例的数列有些特殊所以四次就排好了序,但其实严格按照冒泡排序来说,我们这四轮排序只是排好了4 5 7 8这四个数字,要想完成排序还需进行两轮排序才行。所以要想用冒泡排序排好七个数,则需要排六轮,第一轮需要比较6次,由于每一轮会排好一个数,所以随着轮数的增加每轮的比较次数会递减,

1.2、冒泡排序的代码实现

先int一个数组存储七个数

冒泡排序,外层循环是排序的轮数,内层循环是每轮比较的次数,由于每轮的比较次数与轮数和需要排序的数字数的关系刚好是:比较次数=需要排序的数字数-轮数-1,所以内层循环循环次数即为7-i-1

排序完成后我们需要输出一下数列用一个循环即可输出数组中的数列

运行结果如图所示

二、选择排序

2.1、选择排序的原理讲解

选择排序有升序和降序两种排序方法,

升序排序的原理是:对于一个无序数列,我们先假定其中一个数为这个数列的最小值,然后让这个假定最小值和其他数依次比较,找到这个数列中真实的最小值,将真实最小值和假定最小值的位置互换,这时我们就完成了第一轮排序并排好了第一个数,

第二轮:接着在剩余的数中假定一个最小值,然后让这个假定最小值和其他数(除第一次已经排好的数)依次比较,找到这个数列中真实的最小值,将真实最小值和假定最小值的位置互换,我们就完成了第二轮排序,并排好了第二个数,以此类推直到排序完成

降序排序的原理是:对于一个无序数列,我们先假定其中一个数为这个数列的最大值,然后让这个假定最大值和其他数依次比较,找到这个数列中真实的最大值,将真实最大值和假定最大值的位置互换,这时我们就完成了第一轮排序并排好了第一个数,

第二轮:接着在剩余的数中假定一个最大值,然后让这个假定最大值和其他数(除第一次已经排好的数)依次比较,找到这个数列中真实的最大值,将真实最大值和假定最大值的位置互换,我们就完成了第二轮排序,并排好了第二个数,以此类推直到排序完成

2.2、选择排序的代码实现

我们先假定其中一个数为这个数列的最大值或最小值,记录下这个数在数组中的下标并将这个下标命名为MinOrMax,然后让这个假定的最大值或最小值与其他剩余的数比较,如果出现比这个假定的最小值还要小的数或比假定的最大值还要大的数就把这个数在数组中的下标的值赋值MinOrMax以此类推直到与剩余的数全部比较完成,这时假定的最小值或最大值的下标MinOrMax,就是这个数列真实的最小值或最大值的下标,然后我们将这这两个数的位置互换,就进行完了第一轮排序并排好了第一个数。

升序时:如图1我们先假定0号下标所代表的数3为最小值,此时MinOrMax=0,

图一

然后3和5比较,3小于5,往后走3和2比较3大于2,这时我们就把数字2的下标2赋值给MinOrMax,此时MinOrMax=2,如图二,

图二

继续往后比较2与4比较,2小于4,继续往后比较2和1比较,2大于1,所以将数字1的下标4赋给MinOrMax,此时MinOrMax=4如图三,

图三

继续比较1小于7,1小于8,所以第一轮比较完成,现在MinOrMax=4,所以将下标为4的数字和刚开始的下标为0的数交换位置,即3和1交换位置交换完成后如图四

图四

以此类推排序完成后面几轮排序,排序完的结果如图5。

图五

代码截图如图所示:

最后在main函数中调用这个函数,运行结果如下图。

如果在函数调用时填入除2以外的其他数字就可以用升序排序排序,结果如图。

标签:数列,最大值,假定,冒泡排序,最小值,详解,排序
From: https://blog.csdn.net/m0_57094953/article/details/140751706

相关文章

  • 青云——会话机制(详解)
    为什么会有这种会话机制        1.http协议是无状态的。也就是说每次与服务器进行连接,都必须重新发送请求。连接一次,请求一次。上次和这次的连接没有任何关系。底层的TCP连接会断开,用户的ip地址可能会发生变化。但是浏览器又需要记录访问者。        2.判断......
  • 并查集详解
    一、概念1.定义:并查集(英文:Disjoint-setdatastructure,直译为不交集数据结构)是一种数据结构,用于处理一些不交集(Disjointsets,一系列没有重复元素的集合)的合并及查询问题2.功能:并查集主要有两个功能。将两个元素添加到一个集合中。判断两个元素在不在同一个集合。3.作......
  • 【数据结构】排序
    1.排序的概念及其运用1.1排序的概念排序:指的是将一组数据(通常是一个列表、数组或任何有限集合)按照某种特定的顺序重新排列的过程。这个特定的顺序可以是升序(从小到大)、降序(从大到小)或者根据自定义的规则进行排序。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的......
  • MySQL数据库基础操作与概念详解(三)
    DML和DQL语句1.新增–INSERTINTO表名(字段名,字段名,…字段名)values/value(值,值,…值)–日期使用字符串的形式进行书写日期格式(yyyy-MM-ddHH-dd)1.全字段的输入(1)方式一INSERTINTOstudent(sid,sname,birthday,ssex,classid)VALUES(9,‘张三’,‘2002-9-23’,‘......
  • MySQL数据库基础操作与概念详解(二)
    二、数据库的操作1.--表结构修改–ALTERTABLE表名关键词数据;–ALTERTABLE旧表名renameas新表名;修改表名例:ALTERTABLEstudentrenameasstudents;SHOWTABLES;2.–添加字段ALTERTABLE表名ADD新字段名类型属性;ALTERTABLEstudentsADDstu_......
  • Python自定义排序
    Python封装了成熟的排序函数,我们只需要调用内部的sort函数,就可以完成排序。但是实际场景当中,排序的应用往往比较复杂,比如对象类型,当中有多个字段,我们希望按照指定字段排序,或者是希望按照多关键字排序,这个时候就不能简单的函数调用来解决了。1.字典排序我们先来看下最常见的字典......
  • 小一保姆级 python三大核心多态、抽象类、动态添加内容详解
    一.多态多态是面向对象编程中的一个核心概念,它允许一个接口被多个数据类型实现。这意味着,即使多个类具有不同的内部实现,它们也可以共享一个公共接口。多态的实现通常依赖于继承和方法重写。继承:子类继承父类的属性和方法。方法重写:子类重写父类中的方法,以提供特定的实现。......
  • Java 启动参数最全详解
    Java启动参数最全详解!在Java开发中,发布JAR文件是一个常见的操作。合理设置启动参数可以确保应用程序在不同环境中正常运行,并优化性能。本文将详细介绍所有可能的启动参数,以及它们的使用场景、设置建议和具体示例。一、JAR文件基础JAR(JavaArchive)文件用于打包Java......
  • Linux操作系统下编译、链接过程详解
    gcc和g++的区别:gcc和g++是GNU编译器集合中的两个不同的编译器,它们之间的主要区别在于它们所针对的编程语言以及它们的行为和功能。1.编译器的目标语言:gcc是用于编译C语言的编译器,而g++是用于编译C++语言的编译器。因此它们分别用于编译不同的源代码文件;2.语法支持:gcc和......
  • TCP协议详解
    TCP协议详解TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在网络通信中扮演着至关重要的角色,尤其是在需要保证数据完整性和顺序性的应用场景中。以下是对TCP协议的详细解析,包括其工作原理、特点、应用场合以及关......