首页 程序笔记 冒泡排序和选择排序对比

冒泡排序和选择排序对比

1、冒泡排序:
冒泡排序这种方法的基本思想是,将待排序(未排序序列)的记录看作是竖着排列的“气泡”,键值较小(数值较大)的记录比较轻,从而要往上浮。在冒泡排序算法中要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的记录的顺序是否正确。如果发现两个相邻记录的顺序不对,即“轻”(数值较大)的记录在下面,就变换它们的位置。显然,处理一遍之后,“最轻”的记录就浮到了最高位置,处理 i 遍之后,“次轻”的记录就浮到了次高位置。在作第 i 遍处理时,由于最高位置上的记录已是“最轻”记录,所以不必检查。一般地,第 i 遍处理时,不必检查第 i 高位置以上的记录。
简单来说,冒泡排序就是内循环中相邻两个数进行比较,若第 j 位比第 j+1 位的数大则交换两个数的位置。

/**
* 冒泡排序
*/
public class Sort3 {
    public static void main(String[] args) {
        //定义数组
        int a[] = {5, 3, 6, 2, 4, 1, 9, 8, 0, 7};
        int n;
        // 将外循环的长度定义为数组的长度-1,最后两位只比较一次就可以
        for(int i = 0; i < a.length - 1; i ++) {
            //将内循环的长度定义为数组的长度-1-i,已排好序的序列不用再循环
            for (int j = 0; j < a.length - 1 - i; j ++) {
                //比较相邻两个数的值,若第j位>第j+1位,则两个数交换
                if (a[j] > a[j+1]) {
                    n = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = n;
                }
            }
            //每外循环完成一次,就打印一次结果
            for (int m = 0; m < a.length; m ++) {
                System.out.print(a[m] + " ");
        	}
        System.out.println();
        }
    }
}
运行结果:
3 5 2 4 1 6 8 0 7 9
3 2 4 1 5 6 0 7 8 9
2 3 1 4 5 0 6 7 8 9
2 1 3 4 0 5 6 7 8 9
1 2 3 0 4 5 6 7 8 9
1 2 0 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

2、选择排序:

从待排序的元素中选出最小(大)的元素放在起始位置,然后再从剩余的元素中选出最小(大)的元素放在已排好的部分之后,直到只剩最后一个待排序的元素为止。
简单来说,选择排序就是用外循环的 i 值(基准值)与内循环的 j 值(需要进行比较的值)逐一比较,并将最小(大)的数放在前面。

/**
* 选择排序有小到大进行排序
*/
public class Sort2 {
    public static void main(String[] args) {
        //定义数组
        int a[] = {5, 3, 6, 2, 4, 1, 9, 8, 0, 7};
        int n;
        // 将外循环的长度定义为数组的长度-1,最后两位只比较一次就可以
        for (int i = 0; i < a.length - 1; i ++) {
            //将内循环的长度定义为数组的长度,j = i + 1表示已排好序的序列不用再循环
            for (int j = i + 1; j < a.length; j ++) {
                //将外循环的数第 i 位与内循环的数 j 逐一比较,若第 i 位>第 j 位,则两个数进行交换
                if (a[i] > a[j]){
                    n = a[i];
                    a[i] = a[j];
                    a[j] = n;
                }
            }
            //每外循环完成一次,就打印一次结果
            for (int j = 0; j < a.length; j ++) {
                System.out.print(a[j] + " ");
       		 }
            System.out.println();
        }
    }
}
运行结果:
0 5 6 3 4 2 9 8 1 7
0 1 6 5 4 3 9 8 2 7
0 1 2 6 5 4 9 8 3 7
0 1 2 3 6 5 9 8 4 7
0 1 2 3 4 6 9 8 5 7
0 1 2 3 4 5 9 8 6 7
0 1 2 3 4 5 6 9 8 7
0 1 2 3 4 5 6 7 9 8
0 1 2 3 4 5 6 7 8 9

3、选择排序与冒泡排序总结:

(1)、冒泡排序就是内循环中相邻两个数进行比较,若第 j 位比第 j+1 位的数大则交换两个数的位置。
(2)、选择排序就是用外循环的 i 值(基准值)与内循环的 j 值(需要进行比较的值)逐一比较,并将最小(大)的数放在前面。
(3)、通过上述代码进行对比会发现选择排序和冒泡排序有许多相似的地方,说明这两个排序有相通的地方,两者不是一点都不相通的。
(4)、从运行结果看,外循环每循环完一次后的排序结果来说,冒泡排序是呈右直角三角形的,选择排序是呈左直角三角形的,不过选择排序结果也可以呈右直角三角形,冒泡排序结果也可以呈左直角三角形。
以选择排序为例:

/**
* 先将选择排序由大到小排序
* 再将排序好的选择排序倒序输出
*/
public class Sort2 {
    public static void main(String[] args) {
        int a[] = {5, 3, 6, 2, 4, 1, 9, 8, 0, 7};
        int n;
        for (int i = 0; i < a.length - 1; i ++) {
            for (int j = i + 1; j < a.length; j ++) {
                //将选择排序由大到小排序
                if (a[i] < a[j]){
                    n = a[i];
                    a[i] = a[j];
                    a[j] = n;


                }
            }
            //每外循环完成一次,就倒序打印数组一次结果
            for (int j = a.length-1; j >= 0; j --) {
                System.out.print(a[j] + " ");
        	}
            System.out.println();
        }
    }
}
运行结果:
7 0 8 6 1 4 2 5 3 9
7 0 6 5 1 4 2 3 8 9
6 0 5 4 1 3 2 7 8 9
5 0 4 3 1 2 6 7 8 9
4 0 3 2 1 5 6 7 8 9
3 0 2 1 4 5 6 7 8 9
2 0 1 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

  

2

站心网

1、冒泡排序:冒泡排序这种方法的基本思想是,将待排序(未排序序列)的记录看作是竖着排列的“气泡”,键..

为您推荐

2025年做网站还能赚钱吗?

在2025年,互联网的格局虽然不断演变,但建立网站仍然蕴藏着赚钱的潜力。关键在于如何巧妙地定位,以及如何充分利用最新的技术和趋势。首先,我们需要明确网站的类型和盈利模式。内容型网站,如果运营者擅长某一领域..

DISC测试,让你轻松读懂领导

我们常说“性格决定命运”,企业家的性格决定着企业的命运,而身处企业中的我们,如何和不同性格的老板相处,则直接关系到我们的职场命运。企业家作为掌舵者,他的行为自然决定了整条大船如何行进。行为来自于习惯,..

一个简单的大转盘抽奖程序(附.NetCore Demo源码)

最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql1.前端实现:前端用的是基于开源的lottery,其中有些改动的,使得前端可以自适应pc端..

网站统计中的访问信息收集的前端实现

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascri..

EntityFramework(EF) 控制并发和事务防止超卖

在使用 Entity Framework (EF) 时,实现加减库存并避免超卖的关键是正确地控制并发和事务。以下是实现方法:解决超卖的关键点事务管理:使用事务确保加减库存和库存校验是一个原子操作。悲观锁:通过数据库层面的锁..

使用SuperWebSocket实现Web消息推送

在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。引用SuperWebSocket相..

MySQL查看、修改字符集及Collation

前言在使用MySQL的过程中,可能会出现初始设计使用的字符集或Collation不符合当前需求的情况。如使用utf8的表(MySQL中的utf8即utf8mb3)要支持emoji,而utf8mb3不支持emoji(emoji需要4个字节,而utf8mb3最长只支持..

2025年编程语言需求排行榜

随着技术的不断进步和市场需求的变化,2025年,哪些编程语言将成为企业的首选?在全球,由于技术短缺、人口变化以及对新技能的需求,编程语言的选择和需求也在迅速变化。本文将为您揭示未来最受企业青睐的编程语言,..

.NET C# 使用Hook钩子实现全局监听键盘和鼠标

C# 是一种面向对象的编程语言,具有丰富的类库和工具支持,适用于各种类型的应用程序开发。Windows 提供了一种称为"钩子"(Hook)的机制,允许拦截并处理系统级别的事件,如键盘按键和鼠标移动。通过结合 C# 和 Hook..

帝国CMS8.0即将发布2025年1月18号闪亮登场

一、新增支持PostgreSQL数据库和国产数据库:(支持国产数据库如:国产华为高斯(openGauss)、国产金仓数据库(kingbase)等)1、为了适配其它数据库,所有数据表查询限制数量单独函数返回,并保存在各数据库操作类文件里..

ABP.Net Core使用教程(一)启动模版项目

只需要简单的3步:1,到官网下载模版项目 https://aspnetboilerplate.com/Templates2,用VS2017打开,将Web.Host设置为启动项3,在程序包管理器控制台(Nuget控制台)里设定默认项目为EntityFrameworkCore,执行命令..

.net 通过 HttpClient 下载文件同时报告进度的方法

通过 HttpClient 的 ContentLength 很多时候都可以拿到下载的内容的长度,通过 ReadAsync 可以返回当前读到的长度,将读取到的长度加起来就是已经下载的长度看起来很简单,于是直接给代码private static async Task ..

C#中的线程安全的集合ConcurrentQueue使用示例

在多线程编程中,如何安全地在不同线程之间共享数据是一个非常重要的问题。C# 为我们提供了一些专门设计的线程安全集合,其中之一就是 ConcurrentQueue<T>。它是一种先进先出(FIFO)的数据结构,专门为多线程环境设..

GreenSock: 高性能的 HTML5 动画库

在现代网页开发中,动画已经成为提升用户体验的关键元素。无论是滚动效果、页面切换、按钮点击还是复杂的交互动画,良好的动画效果不仅能吸引用户,还能使界面更加生动、易用。GreenSock(GSAP,GreenSock Animation..

mysql随机获取一条或者多条数据

语句一:select * from users order by rand() LIMIT 1MYSQL手册里面针对RAND()的提示大概意思就是,在 ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低,效率不行,切..

CPU、GPU 和 TPU 之间有什么区别?

什么是 CPU、GPU 和 TPU?它们都是用于计算任务的处理器芯片。可以把你的大脑想象成一台计算机,能够完成诸如阅读书籍或解决数学问题的任务。每一项活动都类似于一个计算任务。例如,当你用手机拍照、发送短信或打开..

从程序媛角度去看项目管理

需求管理下图描述的是程序员从接到需求到开发环节的过程:一般我们首先会收到产品的PRD或交互稿,被询问今天什么时间点是否有空,进行需求评审。时光匆匆,回想起刚毕业那时,我望着冗长的PRD,直接跳过背景、目的等..

鸿蒙系统HarmonyOS支持Docker吗?

华为鸿蒙系统(HarmonyOS)本身并不是直接为容器化设计的操作系统,因此在原生支持上并没有内置对 Docker 的直接支持。不过,可以通过以下方式实现某些 Docker 的功能:1. 鸿蒙系统的定位鸿蒙系统主要针对 IoT(物联..

5个高性能 .NET Core 图片处理库推荐

在使用 .NET Core 开发中,图片处理是一个常见需求,如图像缩放、裁剪、格式转换和添加水印等。以下是一些推荐的 .NET Core 图片处理库,它们功能强大且支持多种图像处理功能:1. ImageSharp简介:ImageSharp 是一个..

ASP.NET如何将Views文件夹从项目分离

将 Views 文件夹从 ASP.NET 项目中分离是一个常见需求,比如为了实现模块化或分层架构。以下是实现此功能的完整步骤,从项目中分离 Views 文件夹,将其移到另一个独立的文件夹或项目中,并确保视图渲染仍然正常。1. ..

发表回复

返回顶部