冒泡排序就这么简单

双向冒泡排序 冒泡排序 性能对比 双向冒泡排序 冒泡排序 性能对比 数据结构与算法与语言无关,此篇博文用的描述语言是go 冒泡排序 冒泡排序的时间复杂度是O(n2) 先看一个简单的冒泡排序 //普通冒泡排序 func normalBubbleSort(sequence []int){ for i := 0;i < len(sequence) - 1;i++ { for j := 0;... 阅读详情

冒泡排序就这么简单

在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的)。现在大三了,想要在暑假找到一份实习的工作,又要回顾一下数据结构与算法的知识点了。

排序对我们来说是一点也不陌生了,当你打王者荣耀的时候也会有段位之分,当你打Dota的时候也有天梯分。从高往下数,这个排名是有规律的,就是一种排序。

我最开始接触的就是冒泡排序,所以这篇博文主要讲的是冒泡排序。

冒泡排序的实现

来源百度百科:

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

算法描述:

  1. i从0开始,i与i+1比较,如果i>i+1,那么就互换
  2. i不断增加,直到i<n-1(n是数组元素的个数,n-1是数组已经最后一个元素) ,一趟下来,可以让数组元素中最大值排在数组的最后面

从最简单开始,首先我们创建一个数组,该数组有5位数字:


int[] arrays = {2, 5, 1, 3, 4};

一、第一趟排序

下面我们根据算法的描述来进行代码验算(第一趟排序):


        //使用临时变量,让两个数互换
        int temp;

        //第一位和第二位比
        if (arrays[0] > arrays[1]) {
            //交换
            temp = arrays[0];
            arrays[0] = arrays[1];
            arrays[1] = temp;
        }

        //第二位和第三位比
        if (arrays[1] > arrays[2]) {
            temp = arrays[1];
            arrays[1] = arrays[2];
            arrays[2] = temp;
        }

        //第三位和第四位比
        if (arrays[2] > arrays[3]) {
            temp = arrays[2];
            arrays[2] = arrays[3];
            arrays[3] = temp;
        }

        //第四位和第五位比
        if (arrays[3] > arrays[4]) {
            temp = arrays[3];
            arrays[3] = arrays[4];
            arrays[4] = temp;
        }

如果前一位的数比后一位的数要大,那么就交换,直到将数组的所有元素都比较了一遍!

经过我们第一趟比较,我们可以发现:最大的值就在数组的末尾了!

一、第二趟排序

第二趟排序跟第一趟排序一样,也是用前一位与后一位比较,如果前一位比后一位要大,那就交换。值得注意的是:并不需要与最后一位比较了,因为在第一趟排序完了,最后一位已经是最大的数了。同理,我们第二趟排序完了之后,倒数第二位也是第二大的数了。

第二趟排序的代码如下:



        //第一位和第二位比
        if (arrays[0] > arrays[1]) {
            //交换
            temp = arrays[0];
            arrays[0] = arrays[1];
            arrays[1] = temp;
        }

        //第二位和第三位比
        if (arrays[1] > arrays[2]) {
            temp = arrays[1];
            arrays[1] = arrays[2];
            arrays[2] = temp;
        }

        //第三位和第四位比
        if (arrays[2] > arrays[3]) {
            temp = arrays[2];
            arrays[2] = arrays[3];
            arrays[3] = temp;
        }

        //第四位不需要和第五位比了,因为在第一趟排序结束后,第五位是最大的了。

结果:我们的第二大数已经排在了倒数第二位了

三、代码简化

值得说明的是:上面的结果看起来已经是排序好的了,其实是我在测试时数据还不足够乱,如果数据足够乱的话,是需要4(n-1)趟排序的!

但我们从上面的代码就可以发现:第一趟和第二趟的比较、交换代码都是重复的,并且我们的比较都是写死的(0,1,2,3,4),并不通用!

我们的数组有5位数字

  • 第一趟需要比较4次
  • 第二趟需要比较3次

我们可以根据上面规律推断出:

  • 第三趟需要比较2次
  • 第四躺需要比较1次

再从上面的规律可以总结出:5位数的数组需要4躺排序的,每躺排序之后次数减1(因为前一趟已经把前一趟数的最大值确定下来了)!

于是我们可以根据for循环和变量将上面的代码进行简化:



        int temp;

        //外层循环是排序的趟数
        for (int i = 0; i < arrays.length - 1 ; i++) {

            //内层循环是当前趟数需要比较的次数
            for (int j = 0; j < arrays.length - i - 1; j++) {

                //前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换
                if (arrays[j] > arrays[j + 1]) {
                    temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                }
            }
        }

四、冒泡排序优化

从上面的例子我们可以看出来,如果数据足够乱的情况下是需要经过4躺比较才能将数组完整排好序。但是我们在第二躺比较后就已经得到排好序的数组了。

但是,我们的程序在第二趟排序后仍会执行第三趟、第四趟排序。这是没有必要的,因此我们可以对其进行优化一下:

  • 如果在某躺排序中没有发生交换位置,那么我们可以认为该数组已经排好序了。
    • 这也不难理解,因为我们每趟排序的目的就是将当前趟最大的数置换到对应的位置上,没有发生置换说明就已经排好序了。

代码如下:


        //装载临时变量
        int temp;

        //记录是否发生了置换, 0 表示没有发生置换、 1 表示发生了置换
        int isChange;

        //外层循环是排序的趟数
        for (int i = 0; i < arrays.length - 1; i++) {

            //每比较一趟就重新初始化为0
            isChange = 0;

            //内层循环是当前趟数需要比较的次数
            for (int j = 0; j < arrays.length - i - 1; j++) {

                //前一位与后一位与前一位比较,如果前一位比后一位要大,那么交换
                if (arrays[j] > arrays[j + 1]) {
                    temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;

                    //如果进到这里面了,说明发生置换了
                    isChange = 1;

                }
            }
            //如果比较完一趟没有发生置换,那么说明已经排好序了,不需要再执行下去了
            if (isChange == 0) {
                break;
            }
        }

五、扩展阅读

C语言实现第一种方式:

        void bubble ( int arr[], int n)
        {
            int i;
            int temp;
            for (i = 0; i < n - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }

        void bubbleSort ( int arr[], int n)
        {
            int i;
            for (i = n; i >= 1; i--) {
                bubble(arr, i);
            }
        }

C语言实现第二种方式递归:

        void bubble ( int arr[], int L, int R)
        {
            if (L == R) ;
            else {
                int i;
                for (i = L; i <= R - 1; i++)//i只能到达R-1 
                    if (arr[i] > arr[i + 1]) {
                        int temp = arr[i];
                        arr[i] = arr[i + 1];
                        arr[i + 1] = temp;
                    }
                bubble(arr, L, R - 1);//第一轮已排好R 
            }
        }

测试代码:


        int main ()
        {
            int arr[] = {2, 3, 4, 511, 66, 777, 444, 555, 9999};
            bubbleSort(arr, 8);
            for (int i = 0; i < 9; i++)
                cout << arr[i] << endl;
            return 0;
        }

5.1时间复杂度的理解:


如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

冒泡排序与链表的冒泡排序 首先看一看简单的冒泡排序是如何实现的: #include <stdio.h> int main() { int a[100],n; printf("请输入数组元素个数:\n"); scanf("%d",&n); printf("请输入数组元素:\n"); for(int k=0;k<n;k++) scanf("%d",&a[k]); /*冒泡排序*/ for(int i=0;i<(n-1);i++) //对于n个数,只需进行n-1次循环排序 f 阅读详情

相关推荐

简单冒泡排序例子

package java1;//包名 public class h{  //文件名     public static void main(String[] args) {       int px[]=new int [] {9,7,4,8,6,5,1,3,2};//要排序的数     for(int x=0;x     for(int y=0;y     if(px[y]>px[y

wddygbk的博客 7275

冒泡排序

什么是冒泡排序? 比如对于一个无序的数组,想让它从小到大排列,则使用冒泡的排序规则如下: 1.将第一个元素和第二个元素进行对比,如果第一个元素大于第二个,则将二者进行交换,反之,则不用交换 2.当第一步比较完之后,对第二个元素和第三个以同样的规则进行比较,依次类推,最终的结果就是这一轮比较中最大的那个数被移动到了最后的位置,符合我们的预期目的 3.进行完第一轮比较,开始第二轮,

IT_ZJYANG的博客 1053

C++简单排序——冒泡排序

冒泡排序,简单的排序方法,C++,适合初学者

小天狼星_布莱克 的博客 2万+

冒泡排序算法

冒泡排序介绍图解 介绍 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 图解 package com.lxg.sort; import java.util.Arrays; /** * @author lxg * @description 冒泡排序 * @date 2021/9/8 *

洛晓关的博客 196

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造)

本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。

sun99的博客 552

全球最大光伏电池缺陷异常检测数据集PVELAD【发布】

下载地址 1:GitHub - binyisu/PVEL-AD 下载地址 2:http://aihebut.com/col.jsp?id=118 下载地址 3:NAVEDownload 竞赛测试系统:Photovoltaic cell anomaly detection | Kaggle 一、简介 PVEL-AD 数据集又叫做EL2021数据集是用于对光伏电池异常缺陷检测方法进行基准测试的数据集,重点是光伏电池工业检测。PVEL-AD包含 36,543 张具有各种内部缺陷和异构背...

苏打水的杯子的博客 2万+

冒泡排序算法(JAVA)

冒泡排序算法(JAVA) 一、   概要 前天,有人问下排序算法的实现,所以抽时间写了个冒泡排序算法。冒泡排序算法的原理是从第一个数开始,依次用当前的数与后面的每个数进行比较,如果当前数大于后面的任何一个数字,都交换当前两个数的位置。在数据比较小的时候使用冒泡排序算法效率还可以(10000长度的整形数组排序大概351ms),但是数组比较长的时候冒泡排序的效率比较低,可以采用快排或者归并。 二

0溺水的鱼O的专栏 1823

合并数组与非合并数组——SystemVerilog

合并型数组(packed): — 合并型数组可以实现连续的存储,赋值时不需要用 '{ }。 //合并型数组 bit [3] [7:0] b_pack // 表示3行 x 8列的数组,[3]是高维度(高维度),[7:0]是低维度(第一维) 数组中,数据排列为{b_pack[3],b_pack[2],b_pack[1],b_pack[0]},其中每个b_pack为8个bit; bit是二值逻辑,每位bit只占据1位。故24位bit只占据一个word(一般一个word为32bit)的存储空间

SummerXRT的博客 7638

【排序】冒泡排序

1、基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,再进行)。 2、演示冒泡过程的例子 【画图理解】 原始数组:3, 9

StudyWinter的博客 920

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(含代码避坑)

本文详细解析了STM32 FOC电机控制中TIM1中心对齐PWM的配置方法,涵盖CubeMX图形化设置、HAL库代码调用及常见问题排查。特别针对L6230Q驱动芯片的使能逻辑和死区时间配置提供实用指南,帮助开发者高效实现无刷电机的高性能控制。

weixin_27027459的博客 442

基于Python爬虫的新闻热点分析与挖掘

本文介绍了基于Python爬虫的新闻热点分析与挖掘方法,主要包括数据收集、预处理、热点分析和可视化四个部分。首先通过爬虫抓取新浪新闻数据,利用文本清洗和存储技术进行数据预处理;接着采用TF-IDF和LDA算法进行关键词提取与主题建模;最后通过词云图和主题分布图实现数据可视化。该方法能有效识别新闻热点,为信息筛选和决策提供支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1545

冒泡排序java实现

目录一.前提二.冒泡排序定义三.分类1.简单冒泡排序2.冒泡排序3.冒泡排序-优化四.时间复杂度五.空间复杂度六.参考 一.前提 1.为简单起见,讨论从小到大的整数排序 2.只讨论基于比较的排序(< = >有定义) 3.只讨论内部排序 4.稳定性:任意两个相等的数据,排序前后相对位置不发生变化 二.冒泡排序定义 是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,将较大的元素往后放,第一次比较完毕,最大值放在最后,依次这样比较,直到数列没有在需要交换,排序完成。 三.分类 1.相

weixin_41570207的博客 1265

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

蜗牛的专栏 3435

C语言冒泡排序:简单版+优化版+链表的冒泡排序

冒泡排序 冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。 它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾!采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止! · · · 简单版–直接法 #include<stdio.h> #define N 6 void swap(int *a,int *

weixin_50545743的博客 1652

KUKA机器人 - 从开机到自动运行

注1:本文仅代表本人对机器人使用的一些建议,在使用机器人前,还请详细阅读库卡机器人官方资料,道路千万条,安全第一条!!! 注2:技术有限,欢迎各位大大在阅读过程中发现各类问题,并且批评指正!!! 目录 一、准备工作 1. 机器人上电完成 2. 电脑安装Workvisual 二、学习手动移动机器人 三、项目配置 1. 设置机器人IP地址 2.电脑和机器人通过网线连接 3.查找并打开项目 4. 通讯配置 5. 项目上传 6. 检验IO配置 四、编程 1.新建程序 2. 程序...

yilunyao的博客 1万+

零基础快速学习 ABAP 读者意见反馈和下一步写作计划表

大家在学习教程过程中,如果有任何关于 SAP ABAP 开发方面想了解的内容,可以直接在教程各篇文章下评论留言,我会将大家的意见统一汇总到下面的表格,作为我更新教程的内容参考来源之一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4273

冒泡排序和双向冒泡排序算法

冒泡排序算法应该算是每个开发者入门必学的基础算法,它逻辑清晰简单,代码实现也并不复杂,这里用自己的话语来总结一下。 (这些为了方便随便打开了一个node项目写的,其他Java ,PHP,C等也是一样的道理,算法讲究的只是一个思维模式,知道怎么去实现就行,不要死抠语言) 先说简单的普通冒泡排序: 冒泡排序既然是一个排序算法,那么它就一定是有一个循环排序的过程,其实它的原理很简单,就是两层for循环嵌...

whiteBearClimb的博客 2917

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

冒泡排序 java_冒泡排序就这么简单

冒泡排序就这么简单在我大一的时候自学c语言和数据结构,我当时就接触到了冒泡排序(当时使用的是C语言编写的)。现在大三了,想要在暑假找到一份实习的工作,又要回顾一下数据结构与算法的知识点了。排序对我们来说是一点也不陌生了,当你打王者荣耀的时候也会有段位之分,当你打Dota的时候也有天梯分。从高往下数,这个排名是有规律的,就是一种排序。我最开始接触的就是冒泡排序,所以这篇博文主要讲的是冒泡排序。冒泡排...

weixin_34734156的博客 222

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

简单的理解冒泡排序

冒泡排序 冒泡排序,是一种较简单的排序算法。 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

哪有那么可爱的小蝈蝈的博客 391

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

冒泡排序的简单优化

1、原始的冒泡排序: #include<stdio.h> int main(){ int num[]={3,1,4,10,2,9,7,5,8,6}; int n=10; for(int i=0;i<n;i++) for(int j=0;j<n-1-i;j++) if(num[j+1]<num[j]) { int t=num[j]; ...

Benny的博客 322

冒泡排序的简单应用

冒泡排序原理 比较两个相邻的元素,将值大的元素交换到右边,就像水底的气泡一样往上冒,故称“冒泡排序”。 冒泡排序思路 依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。 (1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。 (2)比较第2和第3个数,将小数 放在前面,大数放在后面。 … (3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步...

weixin_44824500的博客 793

简单算法之冒泡排序

1.什么是冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 2.冒泡排序图 3.冒泡排序代码实现 p

heidou_2016的博客 312

冒泡排序_简单的冒泡排序算法

简单排序算法:冒泡排序

weixin_63618513的博客 253

冒泡排序、双向冒泡排序

先给出冒泡排序 for (int i = 0; i < arr.length() - 1; i++){ // n个数,走 n-1 趟 for (int j = 0; j < arr.length() - i - 1; i++){ swap(arr[i], arr[j]); } } 双向冒泡,正向一回,反向一回,如此反复。 int left = 0, right = arr.length() - 1; int flag = 1; while (left &

汪帅帅的博客 257

冒泡排序程序java_冒泡排序Java程序

冒泡排序程序javaBubble sort in java is the simplest sorting technique. In bubble sort algorithm each element is compared to next adjacent element, if the next element is smaller, then it will be swapped by ...

culing2941的博客 1079
上一篇: Java高并发秒杀系统【观后总结】
下一篇: SpringMVC【参数绑定、数据回显、文件上传】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值