【数据结构与算法】十大经典排序算法-冒泡排序

🌟个人博客:www.hellocode.top
🏰Java知识导航:Java-Navigate
🔥CSDN:HelloCode.
🌴掘金:HelloCode
🌞知乎:HelloCode
⚡如有问题,欢迎指正,一起学习~~


冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地交换相邻元素的位置来将最大(或最小)的元素逐步“冒泡”到正确的位置。它是一种稳定的排序算法,意味着具有相等键值的元素在排序后的序列中相对位置不会发生改变。

基本思想

在这里插入图片描述

  1. 从序列的第一个元素开始,比较相邻的两个元素大小,如果它们的顺序不正确,则交换它们的位置。
  2. 继续向后遍历序列,对每一对相邻元素执行步骤1,直到序列的末尾。
  3. 重复上述过程,但是每次比较的元素个数减一,因为每次遍历都会将最大(或最小)的元素“冒泡”到正确的位置。
  4. 重复执行以上步骤,直到整个序列排序完成。

如上图所示,传统的冒泡排序就是通过对数组内的元素,从前往后,两两进行比较,每一轮都会确定出一个最大值,放在合适的位置。

代码实现

对应在代码层面,就是两轮for循环来进行遍历,这种思想还是比较简单且容易理解的(简单粗暴)

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 20:43*/
public static void bubbleSort(int[] arr){for(int i = 0; i < arr.length; i++){for (int j = 0; j < arr.length - i - 1; j++){if(arr[j] > arr[j + 1]){// 需要交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

测试:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 20:43*/
public class Test {public static void main(String[] args) {int[] arr = {21, 13, 4, 10, 7, 65, 32, 15, 32, 19};System.out.println("排序前:" + Arrays.toString(arr));BubbleSort.bubbleSort(arr);System.out.println("排序后:" + Arrays.toString(arr));}
}

在这里插入图片描述

优化

优化法一

在每一轮循环之前,设置一个标志位来标记本轮循环是否进行了元素交换。如果在一轮循环中没有发生任何交换操作,说明整个数组已经有序,就无需继续进行后续的比较,直接退出循环。这个优化可以提前结束排序过程,减少了不必要的比较操作,从而提高算法的效率。然而,当数组内的元素乱序程度较高时,这种优化的效果可能并不明显。具体代码如下:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:00*/
public static void bubbleSortOptimized1(int[] arr) {for (int i = 0; i < arr.length; i++) {boolean isSwap = false;for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 需要交换,设置标记位为trueint temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;isSwap = true;}}if (!isSwap) {// 如果一轮循环结束未发生一次交换,则说明已经有序,提前结束循环break;}}
}

测试:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:02*/
public class Test {public static void main(String[] args) {int[] arr = {21, 13, 4, 10, 7, 65, 32, 15, 32, 19};System.out.println("排序前:" + Arrays.toString(arr));BubbleSort.bubbleSortOptimized1(arr);System.out.println("排序后:" + Arrays.toString(arr));}
}

在这里插入图片描述

优化法二

在外层和内层两个循环中,内层循环进行两次遍历:一次从头到尾,找出本轮循环中最大的元素;另一次从尾到头,找出本轮循环中最小的元素。结合优化法一使用标志位提前退出循环的方式,可以进一步减少每轮循环中的比较次数,从而提高冒泡排序的性能。具体代码如下:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:10*/public static void bubbleSortOptimized2(int[] arr) {for (int i = 0; i < arr.length; i++) {boolean isSwap = false;// 从头到尾找出最大元素并将其冒泡到正确位置for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 需要交换,设置标记位为trueint temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;isSwap = true;}}if (!isSwap) {// 如果一轮循环结束未发生一次交换,则说明已经有序,提前结束循环break;}isSwap = false;// 从尾到头找出最小元素并将其冒泡到正确位置for (int j = arr.length - i - 2; j >= i + 1; j--) {if (arr[j] < arr[j - 1]) {// 需要交换,设置标记位为trueint temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;isSwap = true;}}if (!isSwap) {// 如果一轮循环结束未发生一次交换,则说明已经有序,提前结束循环break;}}
}

测试:

/*** @author HelloCode* @blog https://www.hellocode.top* @date 2023年08月07日 21:18*/
public class Test {public static void main(String[] args) {int[] arr = {21, 13, 4, 10, 7, 65, 32, 15, 32, 19};System.out.println("排序前:" + Arrays.toString(arr));BubbleSort.bubbleSortOptimized2(arr);System.out.println("排序后:" + Arrays.toString(arr));}
}

在这里插入图片描述

总结

优点

  1. 冒泡排序算法实现简单,易于理解和实现。
  2. 对于小规模的数据集,冒泡排序可能比其他排序算法性能稍微好一些。
  3. 由于每次只交换相邻元素,冒泡排序可以实现原地排序,不需要额外的内存空间。

缺点

  1. 冒泡排序的时间复杂度较高,特别是对于大规模数据集。它需要进行多次遍历和交换操作,导致性能较差。
  2. 不管数据集是否已经有序,冒泡排序都要执行完所有的遍历和比较操作。

复杂度

  • 时间复杂度:冒泡排序的最坏时间复杂度为O(n2),平均时间复杂度也为O(n2),其中n为待排序序列的长度。在最好情况下(待排序序列已经有序),冒泡排序的时间复杂度为O(n)。
  • 空间复杂度:冒泡排序是一种原地排序算法,不需要额外的内存空间,因此空间复杂度为O(1)。

虽然冒泡排序在实际应用中并不常用,但理解它可以帮助我们理解其他更复杂的排序算法,并且在某些特定场景下,它也可能是一种合理的选择。然而,对于大规模数据的排序,更高效的排序算法(如快速排序、归并排序等)通常会更为适用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MOCK测试

介绍 mock&#xff1a;就是对于一些难以构造的对象&#xff0c;使用虚拟的技术来实现测试的过程。 mock测试&#xff1a;在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;可以用一个虚拟的对象来代替的测试方 法。 接口Mock测试&#xff1a;在接口…

【C++】内存管理与模板

目录 一、内存管理 1.new与delete基本用法 (1) 内置类型 (2) 自定义类型 2.new, delete与malloc, free对比 (1) 内置类型 (2) 自定义类型 (3)综合特点 3.new与delete的底层实现 4. 定位new表达式 二、模板 1.引入机制 2. 基本使用 (1) 函数模板 ①概念&#xff1a…

Hadoop+Python+Django+Mysql热门旅游景点数据分析系统的设计与实现(包含设计报告)

系统阐述的是使用热门旅游景点数据分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体…

06-1_Qt 5.9 C++开发指南_对话框与多窗体设计_标准对话框

在一个完整的应用程序设计中&#xff0c;不可避免地会涉及多个窗体、对话框的设计和调用&#xff0c;如何设计和调用这些对话框和窗体是搞清楚一个庞大的应用程序设计的基础。本章将介绍对话框和多窗体设计、调用方式、数据传递等问题&#xff0c;主要包括以下几点。 Qt 提供的…

OffSec Labs Proving grounds Play——FunboxEasyEnum

文章目录 端口扫描目录扫描文件上传漏洞利用查看用户爆破密码sudo提权flag位置FunboxEasyEnum writeup walkthrough Funbox: EasyEnum ~ VulnHub Enumeration Brute-force the web server’s files and directories. Be sure to check for common file extensions. Remote…

Hadoop理论及实践-HDFS四大组件关系(参考Hadoop官网)

NameNode&#xff08;名称节点&#xff0c;Master主节点&#xff09; NameNode主要功能 1、NameNode负责管理HDFS文件系统的元数据&#xff0c;包括文件&#xff0c;目录&#xff0c;块信息等。它将元数据Fsimage与Edit_log持久化到硬盘上。一个是Fsimage(镜像文件&#xff09…

android,Compose,消息列表和动画(点击item的时候,就会删除)

Compose,消息列表和动画&#xff08;点击item的时候&#xff0c;就会删除&#xff09; package com.example.mycompose08import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundat…

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

PoseiSwap 曾在前不久分别以 IDO、IEO 的方式推出了 POSE 通证&#xff0c;但 PoseiSwap DEX 中并未向除 Zepoch 节点外的角色开放 POSE 资产的交易。而在前不久&#xff0c;PoseiSwap 推出了全新的“Poseidon”池&#xff0c;该池将向所有用户开放&#xff0c;并允许用户自由的…

Git:在本地电脑上如何使用git?

git 版本&#xff1a; 2.40.1.windows.1 文章目录 一. 使用git之前你必须要理解的几个概念1.1 理解工作区、版本库、暂存区的概念1.2 提交Git版本库的步骤【分两步执行】 二. Git本地库实战2.1 初始化版本库2.2 新建 & 提交 & 状态2.3 查看日志2.4 回退 & 穿梭 &am…

Codeforces Round 892 (Div. 2) C. Another Permutation Problem 纯数学方法 思维题

Codeforces Round 892 (Div. 2) C. Another Permutation Problem 源码&#xff1a; #include <iostream> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <stack> #include &l…

面试热题(螺旋矩阵)

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素 一看到这个大家有没有想到 就是一个螺旋形状&#xff0c;那这道题我们应该怎么解决&#xff1f; 我们先来仔细的看&#xff0c;它这种螺旋形状的遍历是先【右-下-左-上】…

aardio 调用 python pickle load 数据

aardio 调用 python pickle load 词典数据&#xff1b; pip install readmdict dump_pickle.py import os import sys import time import pickle from readmdict import MDX, MDDos.chdir("/mdict")mdxfile "your.mdx" if not os.path.exists(mdxfil…

Kotlin和Java互操作时的可空性

注&#xff1a;文中demo的kt版本是1.7.10 一、kotlin语言中的可空性设计 在Java语言中的NPE&#xff08;NullPointerException&#xff09;可以说非常常见&#xff0c;而且诟病已久。 kotlin做为后起之秀&#xff0c;在空指针的问题上进行了升级&#xff0c;即&#xff1…

数据结构-带头双向循环链表的实现

前言 带头双向循环链表是一种重要的数据结构&#xff0c;它的结构是很完美的&#xff0c;它弥补了单链表的许多不足&#xff0c;让我们一起来了解一下它是如何实现的吧&#xff01; 1.节点的结构 它的节点中存储着数据和两个指针&#xff0c;一个指针_prev用来记录前一个节点…

微服务监控技术skywalking的部署与使用(亲测无坑)

微服务监控技术skywalking的部署与使用 1. 前期准备2. skywalking安装部署2.1 Java Agent2.2 apache/skywalking-oap-server2.3 apache/skywalking-ui 3. 项目启动4.效果展示 1. 前期准备 注&#xff1a;本篇文章采用docker部署&#xff0c;采用8.2.0版本&#xff0c;版本一定…

【Nginx】Nginx负载均衡

负载均衡&#xff1a;通过反向代理来实现 Nginx的七层代理和四层代理&#xff1a; 七层是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模块当中 &#xff1b;配置的方法名称为&#xff1a;upstream模块&#xff0c;不能写在server中也不能写在location中&a…

FPGA实践 ——Verilog基本实验步骤演示

0x00 回顾&#xff1a;AND/OR/NOT 逻辑的特性 AND&#xff1a;与门可以具有两个或更多的输入&#xff0c;并返回一个输出。当所有输入值都为 1 时&#xff0c;输出值为 1。如果输入值中有任何一个为 0&#xff0c;则输出值为 0。 OR&#xff1a;或门可以具有两个或更多的输入…

湘大 XTU OJ 1290 Alice and Bob 题解(非常详细):字符串 分类讨论 简单模拟

一、链接 1290 Alice and Bob 二、题目 题目描述 Alice和Bob玩剪刀-石头-布的游戏&#xff0c;请你写个程序判断一下比赛的结果。 输入 第一行是一个整数K&#xff0c;表示样例的个数。 以后每行两个单词&#xff0c;rock表示石头&#xff0c;paper表示布&#xff0c;scis…

山东布谷科技直播程序源码使用Redis进行服务器横向扩展

当今&#xff0c;直播程序源码平台作为新媒体时代主流&#xff0c;受到了世界各地人民的喜爱&#xff0c;这也使得直播程序源码平台用户数量的庞大&#xff0c;也难免会出现大量用户同时访问服务器&#xff0c;使服务器过载的情况&#xff0c;当服务器承受不住的时候&#xff0…

Win11中使用pip或者Cython报错 —— error: Microsoft Visual C++ 14.0 is required.

第一步&#xff1a;下载Visual Studio 2019 下载地址&#xff1a; https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes 第二步&#xff1a;安装组件 选择单个组件&#xff0c;勾选以下两个组件 其他错误&#xff1a; 无法打开文件“python37.li…