JAVA 冒泡排序算法

devtools/2025/1/11 21:26:45/

1.冒泡排序

冒泡排序是最基本的排序算法,通过对待排序序列从前向后依次比较相邻元素的值,如果发现逆序就进行交换,使值较大的元素从前向后移,就像水底下的气泡一样逐渐向上冒。

d074b4f819ae45468af05d749413d3f4.gif

 冒泡排序算法是重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复进行直到没有再需要交换的元素,这意味着数列已经排序完成。

冒泡排序算法适用于小型数据集,对大型数据集排序性能较差,不建议使用!

冒泡排序算法代码:

private int[] bubbleSort(int arr[]) {

       int n=arr.length;

        for(int i=0; i<n-1; i++) {

           for(int j=0; j<n-i-1; j++) {

               if(arr[j] > arr[j+1]) {

                    int temp = arr[jj;

                    arr[jj = arr[j+1];

                    arr[j+1] = temp;

                }

           }

       }

    return arr;

}

①从数组的第一个元素开始,依次比较相邻的两个元素。

②如果前一个元素大于后一个元素,交换它们的位置。

③继续比较下一对相邻元素,直到最后一个元素。

④重复以上步骤,每一轮比较都会将最大的元素"冒泡"到最后面。

⑤当比较结束时,此时数组已经排好序,排序结束。

从代码中可以看出:

①一共进行数组的大小-1次大的循环。

②每一趟排序的次数在逐渐减少。

③如果在某趟排序中,没有发生一次交换,就可以提前结束冒泡排序,这就是优化。

2.冒泡排序的优化

排序过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此可以在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。

private int[] bubbleSort(int arr[]) {

        boolean flag=false; //标志是否发生过交换

       int n=arr.length;

        for(int i=0; i<n-1; i++) {

           for(int j=0; j<n-i-1; j++) {

               if(arr[j] > arr[j+1]) {

                    int temp = arr[j];

                    arr[j] = arr[j+1];

                    arr[j+1] = temp;

                    flag=true;  //发生了交换

                }

           }

            if(!flag) {

               return arr; //某次循环没有发生交换,就退出

            } else {

                flag = false;  //重新开始新的循环,重置flag

            }

       }

     return arr;

}

3.冒泡排序的复杂性

时间复杂度分析:在最坏的情况下,冒泡排序需要进行n-1轮比较,每轮比较需要进行n-i次。因此,总的比较次数为(n-1) + (n-2) + … + 2 + 1 = n(n-1)/2,近似为O(n2)

空间复杂度分析:使用了常数个变量,因此空间复杂度为O(1)。

5.稳定性分析

稳定性指的是相同的数据所在的位置经过排序后是否发生变化。换句话说就是大小相同的两个值在排序之前和排序之后的先后顺序不变,这就是稳定的。

冒泡排序将小的元素往前调或者把大的元素往后调;比较的是相邻的两个元素,交换也发生在这两个元素之间;因为相等的元素不会进行交换,所以稳定。

6.冒泡排序的优点

尽管冒泡排序有点慢,但它也具有某些优点,如下所示:

  • 易于实施和理解。
  • 由于不需要额外的内存,该算法的空间复杂度为 O(1)。
  • 它是一种稳定的排序算法,这意味着具有相同键值的元素在排序输出中保持其相对顺序。

http://www.ppmy.cn/devtools/149700.html

相关文章

每天40分玩转Django:Django Docker化学习指南

Django Docker化学习指南 1. 学习目标 理解Docker容器化的基本概念和优势掌握Django应用的Docker化过程学习使用Docker Compose管理多容器应用 2. 核心知识点 知识点重要程度掌握要求Dockerfile编写⭐⭐⭐⭐⭐熟练掌握Docker基本命令⭐⭐⭐⭐熟练掌握Docker Compose配置⭐⭐…

如何高效格式化输出 JSON 字符串

引言 JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;已经成为了各种编程语言间传递数据的标准。无论是在 Web 开发中与前端进行数据交互&#xff0c;还是在微服务架构中进行服务之间的通信&#xff0c;JSON 数据格式都有着…

C++ 实现简单多数法

以下是几种用 C 实现简单多数法的代码示例&#xff1a; 暴力遍历法 收起 cpp #include <iostream> #include <vector>char majorityElementBruteForce(const std::vector<char>& grades) {int n grades.size();for (int i 0; i < n; i) {int cou…

基于单片机的数字气压计设计

摘要:在嵌入式技术快速发展过程中&#xff0c;智能测量仪器被广泛应用于工业生产以及人们日常生活领域。数字气压计在实际应用中&#xff0c;利用气压传感器检测环境中的压力大小&#xff0c;便于实现对设备进行智能化的控制操作。数字气压计在气象监测、矿产开采、科学实验等环…

C语言基础:野指针、空指针、空悬指针

野指针、空指针、空悬指针 野指针 定义&#xff1a;只想一块未知区域&#xff08;以及销毁或者访问受限的内存区域外的已存在或不存在的内存区域&#xff09;的指针&#xff0c;被称作野指针。野指针是危险的。 危害&#xff1a; ① 引用野指针&#xff0c;相当于访问了非法…

Python网络爬虫简介-科普版

Python网络爬虫简介 一、什么是网络爬虫 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网页蜘蛛、网页机器人&#xff0c;是一种按照一定规则自动抓取互联网信息的程序。它通过模拟浏览器的行为&#xff0c;访问网页&#xff0c;获取网页内容&#xff0c;并…

探索电商宝藏:用Java打造1688商品详情爬虫,挖掘商业价值

在数字化浪潮的推动下&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;成为现代商业版图中举足轻重的一环。作为国内领先的B2B电商平台&#xff0c;1688汇聚了海量商品和众多供应商&#xff0c;宛如一座蕴藏丰富商机的宝藏。然而&#xff0c;如何高效地挖掘这座宝藏…

jenkins入门10--自动化构建

build periodically&#xff1a;设定类似cron周期性时间触发构建 * * * * * (五颗星&#xff0c;中间用空格隔开&#xff09; 第一颗表示分钟&#xff0c;取值0~59 第二颗表示小时&#xff0c;取值0~23 第三颗表示一个月的第几天&#xff0c;取值1~31 第四颗表示第几月&#xf…