排序算法之冒泡排序(图解)

2023-11-07

1.冒泡排序

wikipedia:

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

为什么介绍用“浮”呢?看它的动图应该就可以理解了。

Bubble_sort_animation.gif

总结一下就是:比较相邻的两个元素然后交换这两者,一直到一整个数列都按照顺序排列。

2.冒泡排序的步骤

可以先看动图,如果动图就能够理解的话,就不需要看下面的步骤了。
bubbleSort.gif

如果觉得动图太快,可以按照下面的步骤一步步理解。

第一次迭代

  1. 从第一个下标开始,也就是0,比较第一个和第二个元素。
  2. 如果第一个元素比第二个元素大,那就交换两者。
  3. 然后比较第二个元素和第三个元素,如果两者也不是升序,那交换两者。
  4. 一直比较和交换,直到最后。

Bubble-sort-0.webp

之后的迭代

冒泡排序就是不断重复迭代的过程,随着不断的交换,大的元素会和动图一样交换到后面,小的元素则会换到前面。下图是第二次迭代。

Bubble-sort-2.webp

下图是最后一次迭代,当-2和-9交换后,这一整个数组的排序就完成了。

Bubble-sort-3.webp

3.冒泡排序的实现

伪代码

function bubble_sort (array, length) {
    var i, j;
    for(i from 0 to length-1){
        for(j from 0 to length-1-i){
            if (array[j] > array[j+1])
                swap(array[j], array[j+1])
        }
    }
}

助记码

i∈[0,N-1)               //循环N-1遍
   j∈[0,N-1-i)           //每遍循环要处理的无序部分
     swap(j,j+1)          //两两排序(升序/降序)

Python

# Bubble sort in Python

def bubbleSort(array):
    
  # loop to access each array element
  for i in range(len(array)):

    # loop to compare array elements
    for j in range(0, len(array) - i - 1):

      # compare two adjacent elements
      # change > to < to sort in descending order
      if array[j] > array[j + 1]:

        # swapping elements if elements
        # are not in the intended order
        temp = array[j]
        array[j] = array[j+1]
        array[j+1] = temp


data = [-2, 45, 0, 11, -9]

bubbleSort(data)

print('Sorted Array in Ascending Order:')
print(data)

Java

// Bubble sort in Java

import java.util.Arrays;

class Main {

  // perform the bubble sort
  static void bubbleSort(int array[]) {
    int size = array.length;
    
    // loop to access each array element
    for (int i = 0; i < size - 1; i++)
    
      // loop to compare array elements
      for (int j = 0; j < size - i - 1; j++)

        // compare two adjacent elements
        // change > to < to sort in descending order
        if (array[j] > array[j + 1]) {

          // swapping occurs if elements
          // are not in the intended order
          int temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
        }
  }

  public static void main(String args[]) {
      
    int[] data = { -2, 45, 0, 11, -9 };
    
    // call method using class name
    Main.bubbleSort(data);
    
    System.out.println("Sorted Array in Ascending Order:");
    System.out.println(Arrays.toString(data));
  }
}

C

// Bubble sort in C

#include <stdio.h>

// perform the bubble sort
void bubbleSort(int array[], int size) {

  // loop to access each array element
  for (int step = 0; step < size - 1; ++step) {
      
    // loop to compare array elements
    for (int i = 0; i < size - step - 1; ++i) {
      
      // compare two adjacent elements
      // change > to < to sort in descending order
      if (array[i] > array[i + 1]) {
        
        // swapping occurs if elements
        // are not in the intended order
        int temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
      }
    }
  }
}

// print array
void printArray(int array[], int size) {
  for (int i = 0; i < size; ++i) {
    printf("%d  ", array[i]);
  }
  printf("\n");
}

int main() {
  int data[] = {-2, 45, 0, 11, -9};
  
  // find the array's length
  int size = sizeof(data) / sizeof(data[0]);

  bubbleSort(data, size);
  
  printf("Sorted Array in Ascending Order:\n");
  printArray(data, size);
}

C++

// Bubble sort in C++

#include <iostream>
using namespace std;

// perform bubble sort
void bubbleSort(int array[], int size) {

  // loop to access each array element
  for (int step = 0; step < size; ++step) {
      
    // loop to compare array elements
    for (int i = 0; i < size - step; ++i) {

      // compare two adjacent elements
      // change > to < to sort in descending order
      if (array[i] > array[i + 1]) {

        // swapping elements if elements
        // are not in the intended order
        int temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
      }
    }
  }
}

// print array
void printArray(int array[], int size) {
  for (int i = 0; i < size; ++i) {
    cout << "  " << array[i];
  }
  cout << "\n";
}

int main() {
  int data[] = {-2, 45, 0, 11, -9};
  
  // find array's length
  int size = sizeof(data) / sizeof(data[0]);
  
  bubbleSort(data, size);
  
  cout << "Sorted Array in Ascending Order:\n";  
  printArray(data, size);
}

4.冒泡排序的复杂度

时间复杂度
最优 O(n)
最坏 O( n 2 n^2 n2)
平均 O( n 2 n^2 n2)
空间复杂度 O(1)
稳定性 Yes

平均复杂度的计算

循环 比较的次数
1st (n-1)
2nd (n-2)
3rd (n-3)
last 1

所以,比较的次数是

(n-1) + (n-2) + (n-3) +.....+ 1 = n(n-1)/2

基本上等于 n 2 n^2 n2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法之冒泡排序(图解) 的相关文章

随机推荐

  • A Survey on VQA: Datasets and Approaches

    VQA综述类论文的阅读 VQA综述类论文的阅读 A Survey on VQA Datasets and Approaches 介绍 数据集 图像类数据集 Balanced VQA Datasets of Statistical Figur
  • Cglib动态代理

    JDK实现动态代理需要实现类通过接口定义业务方法 对于没有接口的类 如何实现动态代理呢 这就需要CGLib了 CGLib采用了非常底层的字节码技术 其原理是通过字节码技术为一个类创建子类 并在子类中采用方法拦截的技术拦截所有父类方法的调用
  • 远程计算机需要网络级别身份验证,而您的计算机不支持该验证的解决方法

    故障 远程计算机需要网络级别身份验证 而您的计算机不支持该验证 请联系您的系统管理员或者技术人员来获得帮助 故障症状 当您使用Windows XP 远程桌面连接 工具去连接Windows Vistas或Windows Server 2008
  • 多线程(八):并发编程的三大特性之原子性

    目录 通过一个demo认识原子性 java中只有以下操作是原子性的 上锁的本质 那么如何保障数据的一致性呢 如何理解锁的粒度 如何保障操作的原子性 什么是悲观锁 什么是乐观锁 什么是CAS 什么是ABA问题 乐观锁和悲观锁哪种效率跟高 sy
  • 查看电脑的物理地址

    如何快速查看自己电脑的物理地址呢 上一篇讲到如何把逻辑地址转换为物理地址 但仅仅涉及页式存储的求解 下面来看看如何如何查看自己电脑的物理地址 方法一 CMD命令查看 1 点击快捷键 win R 或右击开始点击运行 在运行的输入框内输入 cm
  • 排序算法杂谈(四) —— 快速排序的非递归实现

    1 前提 排序算法 七 快速排序 排序算法杂谈 三 归并排序的非递归实现 2 快速排序与归并排序的递归 快速排序 Quick Sort 与归并排序 Merge Sort 虽然都采用了递归地思想 但是其递归地本质却有所不同 快速排序 手动划分
  • 如何解决计算机改名之后无法连接SQL数据库的问题

    如何解决计算机改名之后无法连接SQL数据库的问题 更换计算机名字后出现SQL SERVER 无法连接的问题 接下来我将介绍最简单的解决这个问题的办法 如图所示服务器名称和用户名不一样 此处用户名就是我更改后的计算机名字 我对此进行了打码 点
  • 银联在线支付---利用测试案例代码模拟支付应用(修改)

    一 工程搭建 新建一个Web工程 命名为PayOnLine 把你下载好的案例代码拷贝到你的工程下 我的代码目录如下 acp sdk properties配置文件需要放在类根路劲下 里面的参数配置信息 下面是案例提供的配置提示 0 注意 1
  • rational rosa_使用Rational Application Developer,第1部分,在Web应用程序中集成Crystal Reports使用JDBC连接在Web应用程序中嵌入Crystal Reports

    存档日期 2019年5月14日 首次发布 2006年4月18日 本文针对希望将Crystal Reports嵌入其Web应用程序中以满足其报表需求的开发人员 它是一个分为4部分的系列文章的第1部分 它将为您提供使用IBM Rational
  • 【牛客】HJ5——进制转换(华为)

    牛客 HJ5 进制转换 华为 题目描述 解题思路 代码详解 ACM模式 注意点 题目描述 写出一个程序 接受一个十六进制的数 输出该数值的十进制表示 输入描述 输入一个十六进制的数值字符串 注意 一个用例会同时有多组输入数据 输出描述 输出
  • 微信新版代金券

    微信代金券的注意事项 1 直连商户或者服务商需要登录微信商户后台开通预充值营销插件和免充值营销插件 2 公众账号的appid 与商户号关联绑定关系 3 小程序需要小程序appid与商户号关联绑定 4 需要服务商或者直连商户的cert证书的序
  • RSS 源订阅

    RSS源的提供站点 FeedX FeedX 提供一些网站的RSS订阅源 https feedx co feed RSS Hub Rss Hub 自制RSS源 https rsshub app rsshub rss 参考 给新手写得 RSS
  • Qt for Windows:Qt 5.4.0 MinGW 静态编译版本制作

    本文将讲述如何在Windows中 用源码版本的Qt制作出一个可以一键静态编译Qt 我使用的环境是 Windows7 64位 旗舰版 大致流程 1 安装Qt 源码版 以及其他必要的环境 2 编译 安装 3 配置 4 使用 正文分割线 1 安装
  • 电脑复制粘贴_没有比这更加简单的赚钱方法了,一台电脑复制粘贴月收益上万...

    给大家介绍的这个项目叫做销售虚拟产品项目 这个暴利虚拟项目 几乎是无本生意 也特别适合小白来操作 简单的说就是卖虚拟产品 所谓 虚拟产品 就是指小吃技术 视频教程 学习资料 网赚项目这些 不包括话费 点卡之流 就是没有实物 不需要发货 客户
  • Golang一面

    前面问了一堆java问题 面试没准备 全残 1 redis分布式锁有了解吗 2 redis存储的基本类型 3 new和make的区别 4 mysql索引失效怎么办 5 如何优化mysql 6 水平分表和垂直分表 7 秒杀保证数据的一致性 8
  • 半自动爬虫

    半自动爬虫 顾名思义就是一半手动一半自动地进行爬虫 手动的部分是把网页的源代码复制下来 自动的部分是通过正则表达式把其中的有效信息提取出来 在百度贴吧中任意寻找一个贴吧并打开一个热门帖子 将帖子的源代码复制下来 并保存为source txt
  • VUE.SCOPE的使用(如何将table中某行作为参数传入函数)

    要理解scope 首先要引入一个场景 如下是一个普通的
  • python日常实用技能:利用python将图片转换成excel文档格式

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容 分享出来供大家参考学习 下面话不多说了 来一起看看详细的介绍吧 实现步骤 读取图像 获取图像每
  • 无法运行英特尔HAXM安装程序 解决办法

    许多小伙伴在学习andriod过程中会遇到这个问题 Android SDK is up to date Running Intel HAXM installer Unable to run Intel HAXM installer 无法启动
  • 排序算法之冒泡排序(图解)

    冒泡排序 1 冒泡排序 wikipedia 2 冒泡排序的步骤 第一次迭代 之后的迭代 3 冒泡排序的实现 伪代码 助记码 Python Java C C 4 冒泡排序的复杂度 平均复杂度的计算 1 冒泡排序 wikipedia 冒泡排序