目录

1、缘起

2、BubbleSort 算法描述

3、用图示描述 BubbleSort 算法

4、C 语言描述

5、Python 语言描述

6、Java 语言描述

7、总结


1、缘起

冒泡排序算法 是一个非常经典的算法,它是各大网络编程平台上的座上宾,面试官口中的最爱。这个算法就是因其中数字从列表的开始向顶部移动的方式 就像水泡从水中冒出的样子 而得名,将较大的元素逐步"冒泡"到数组的顶部,从而实现排序。

虽然效率不如其他高级排序算法,但冒泡排序算法的思想易于理解和实现,是学习排序算法的入门良品。通过这篇博客让我们来翔实的了解一下冒泡排序算法吧 !本篇博客所讲解的冒泡排序算法的排序为 升序

2、BubbleSort 算法描述

假设将需要排序的数字列表分成两个子列表: 已排序的未排序的。在未排序子列表中,最小的元素通过冒泡的方法选出来并移到已排序子列表中。

未排序子列表 中的元素从前往后两两比较大小,如果一个元素比另外一个元素小,那么将这两个元素交换位置;否则,不进行任何处理,则进行下一次的元素两两比较;直到最大的元素排到合适的位置。最大元素排到合适的位置称之为一轮排序,一个含有N个元素的数字列表则需要 N-1轮来完成数据排序。

为什么是 N-1 轮排序?当未排序子列表剩下两个元素时,只需要交换一次数据,就完成了整个原始列表的数据排序。所以排序轮数比元素的个数少1。

3、用图示描述 BubbleSort 算法

注:红色方块左边为未排序元素,右边为已排序元素 

第一轮,从 9 开始并把它与 5 比较,9 大于 5 则这两个元素进行位置交换。9 大于 7 则这两个元素进行位置交换。9 大于 1 则这两个元素进行位置交换。9 大于 3 则这两个元素进行位置交换,9 到达合适的位置。图中只给出了每一轮排序后的数字列表,每一轮排序的数据交换细节并没给出,我将其留给各位小伙伴作为练习。这里只详细的写了第一轮冒泡排序算法的具体过程,剩余轮数也留给各位小伙伴作为练习。

上图中,在第 3 轮后数字列表已经排好顺序了,在 4 轮不会有数据交换。如果在元素更多的情况下,在排序轮数还没达到 N-1 轮,可能整个数字列表就已经排好顺序了。如果在排序过程中,数字列表已经提前排好顺序,但是算法中没有提前结束排序的功能,那么这个算法就会跑完 N-1 轮排序才会停止。这时,冒泡排序算法的性能并不是很好。

这时,我们可以在算法中包含一个 指示器(标志位),如果在一轮排序中没有数据交换,说明整个数字列表已经排好顺序了那就停止排序,这样可以减少冒泡排序算法的排序轮数,改善冒泡排序算法的性能。

4、C 语言描述

#include<stdio.h>//函数声明
void BubbleSort(int* arr, int sz);//冒泡排序法(BubbleSort)
int main()
{//将需要排序的数字存入数组int arr[] = { 5,4,3,2,1};//求数组中元素的个数int sz = (sizeof(arr) / sizeof(arr[0]));//将数组传入函数BubbleSort(arr, sz);//打印已排序的数组for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}   void BubbleSort(int* arr, int sz)
{//确定冒泡排序的轮数for (int i = 0; i < sz - 1; i++){//标志位,假设在排序过程中剩余的元素已经排好顺序了int flag = 1;//每一次冒泡排序for (int j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;flag = 0;}}//在排序过程中已排好序了,就不会有数据交换//即标志位就不会重新被赋值if (flag == 1){break;  //跳出排序轮数循环}}
}

关键代码解释:

第二层循环判断条件:j < sz - 1 - i 

表达式分两步解释

①  sz - 1: 在一轮排序中,元素两两比较的次数比元素个数少1。

②  -i  : 减去的是已排序的元素个数,即已排序的元素不参与排序,只排未排序的元素。每一轮排序就会排好一个元素,即排序轮数和已排序元素的个数相同,所以是 -i。

5、Python 语言描述

def BubbleSort(arr):'''冒泡排序算法'''# 求数字列表中元素的个数sz = len(arr)for i in range(sz - 1):# 标志位,假设在排序过程中剩余的元素已经排好顺序了flag = 1for j in range(sz - i -1):if arr[j] > arr[j + 1]:arr[j],arr[j + 1] = arr[j + 1],arr[j]flag = 0# 在排序过程中已经排好顺序了,就不会有数据交换# 即标志位就不会重新被赋值if flag == 1:breakif __name__ == '__main__':arr = [5,4,3,2,1]BubbleSort(arr)print("排序后的数字列表")for i in range(len(arr)):print(arr[i],end = " ")

6、Java 语言描述

public class BubbleSort
{public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {# 标志位,假设在排序过程中剩余的元素已经排好顺序了flag = 1for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 数据交换int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}//在排序过程中已排好序了,就不会有数据交换//即标志位就不会重新被赋值if (flag == 1){break;  //跳出排序轮数循环}}}public static void main(String[] args) {int[] arr = {5,4,3,2,1};bubbleSort(arr);System.out.println("排序后的数组:");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

7、总结

这篇文章写了 BubbleSort 算法的文字描述、图示描述和代码描述。在这里为了方便实现此算法只输入了 5 个正整数。算法一般情况下具有通用性,所以这个 BubbleSort 算法可以对 n 个整数进行排序。

各位小伙伴,也可以拷贝代码清单试试输入更多的整数(正整数,0和负整数),看看这个算法能不能对数字列表正确排序。本期的分享总结就到这里了,如果有疑问的小伙伴,我们在评论区交流嗷,笔者必回,我们下期再见啦 !

【数据结构与算法】冒泡排序算法(BubbleSort)相关推荐

  1. 排序算法-冒泡排序算法

    2019独角兽企业重金招聘Python工程师标准>>> 冒泡排序算法是所有排序算法中最简单.最基础的一种.冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的. 冒泡排 ...

  2. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. C++常见排序算法——冒泡排序算法

    首先说一下冒泡排序的基本算法思想: 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交换过来. 这个算法的名字由来是因为越小的元素会经由交换慢慢 ...

  4. JAVA手写算法 | 冒泡排序算法

    目录 原理 排序演示 JAVA实现 算法分析 算法优化 冒泡排序(Bubble Sort)是一种基础的交换排序. 所谓交换排序就是通过元素的两两比较,判断是否符合要求,如果不符合则交换元素位置来达到排 ...

  5. 经典排序算法----冒泡排序算法及其优化(稳定)

    冒泡排序(稳定) 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的:如果两个相等的 ...

  6. 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

    目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...

  7. Java | 用Java实现冒泡排序算法

    冒泡排序算法 冒泡排序算法思路:(以从小到大为例) 从第一个元素开始,相邻的两个元素比较,若前者比后面的大,则两者交换顺序: 一次比较后,从第二个元素开始,相邻的仍遵循大者后移的规律完成一轮遍历: 一 ...

  8. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  9. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. linux 安装安装rz/sz 和 ssh
  2. linux基础,文件目录管理,cd、rm、mkdir
  3. 自动切换电脑或手机版(php aspx),ASP程序自动判断是电脑或手机访问网站。
  4. [蓝桥杯]算法提高 道路和航路(spfa+deque+快读优化)
  5. OJ1046: 奇数的乘积(C语言)
  6. zookeeper3.5.4源码环境搭建
  7. 软件测试 学习之路 基本介绍
  8. 基本的Material Design布局结构
  9. WebSocket子协议STOMP详解
  10. 大数据学习第一章:初识大数据
  11. 计算机休眠唤醒后没声音,MacBook Pro从睡眠模式中唤醒后突然没有声音
  12. 纬衡、金蝶、腾讯、迅雷获深圳软件明星企业称号
  13. c#实现Udp通信(四)--UPD大数据量接收(异步接收)
  14. Matrix使用解析
  15. win7 计算机休眠,WIN7如何关闭睡眠和休眠方式(真正的)
  16. Ubuntu14.04 Firefox无法播放视频
  17. 电视hdr测试软件,短路三分钟 | 你家电视、显示器真的支持HDR么?
  18. matlab保存nii_Matlab实现NIfTI(ANALYZE)核磁共振图像读写
  19. IOS 最右 注册 登录协议分析记录
  20. 算法的时间与空间复杂度(精细+举例)

热门文章

  1. NAS实现家用服务器
  2. java写培根披萨和海鲜披萨_培根海鲜披萨的做法【图解】_培根海鲜披萨的家常做法_培根海鲜披萨怎么做_下午茶...
  3. 在Ubuntu18.04 LTS下升级Python版本
  4. riscv-gnu-toolchain工具链的安装
  5. Java栈的实现数组和链表
  6. ARM SMMU的原理与IOMMU[转载]
  7. NLP-词汇表征与词嵌入
  8. C#,图像二值化(13)——全局阈值的双峰平均值算法(Bimodal Thresholding)与源程序
  9. AGORA数据集简介 (SMPL,SMPL-X)
  10. rsync命令以及xsync封装