冒泡 冒泡,不管学什么语言,冒泡排序是必经的。
在学C语言时每次都要花好久来想,然后写程序,而且下次再写还是花好久才行,花了一个多小时,写了这个博客,希望入门的小白不要入坑了,好好看看,真的挺简单的。
内有C语言 c++ python Java的源码,希望对大家有所帮助。

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
比喻来说冒泡就像是水里的气泡,大的气泡就飘起来,小的就沉下去(在编程里当然也可以反过来)。好下面来看看他是怎么操作的。
现在从小到大排序为例
原理: 比较两个相邻的元素,较大的数慢慢往后排,较小的数慢慢往前排。每一趟遍历,将一个最大的数移到序列末尾。

想一下,有n个数要遍历几遍?两个数遍历一遍,三个数遍历两遍,n个数就是n-1遍。
以这个为例,有小到大排序:

现在有六个数,所以用 5 次大循环进行两两比较
循环一

  • 2 5不用交换,往下走
  • 5 8不交换,继续
  • 8 1交换,顺序为 2 5 1 8 6 4 继续
  • 8 6交换 顺序为 2 5 1 6 8 4 继续
  • 8 4交换 顺序为 2 5 1 6 4 8 第一轮完成,找到了最大的那个并把他放到了最后

现在最后一个数已经确定了,是最大的,所以下一轮循环就不用比较到他了。


循环二

  • 2 5不用交换,往下走
  • 5 1交换, 2 1 5 6 4 8 继续
  • 5 6不交换,继续
  • 6 4交换 顺序为 2 1 5 4 6 8 ok现在找到了第二大的,并把他放到了倒数第二个位置,下次循环就不用比较已经找出来的6和8了
    循环三
  • 2 1交换 1 2 5 4 6 8继续
  • 2 5不换 继续
  • 5 4 交换1 2 4 5 6 8找到了第三大的5,并把他放到了倒数第三个位置

可以看出现在已经排序完成,但计算机并不知道,他还在继续他的循环。

循环四

  • 1 2不换 继续
  • 2 4不换 顺序没变

循环五

  • 1 2不换 顺序不变

可以看下下面的动态图,让思路更清晰

  1. 有n数排序,就要循环n-1次,这称之为大循环
  2. 每经历一次大循环都要对数组里面的数进行比较交换,所以每次大循环后还有一次小循环。
  3. 每次小循环都比上一次小循环少遍历(或者说是比较)一个数,因为每次大循环都会找到一个最大的,并把他放到后面。

下面来进行编程实现

// C语言版
#include<stdio.h>
void swap(int *a,int *b){int temp = *a;*a = *b;*b = temp;
}int main(){int arr[6]={2,5,8,1,6 ,4};int i, j, temp,len=6;for (i = 0; i < len - 1; i++)for (j = 0; j < len - 1 - i; j++)if (arr[j] > arr[j + 1]) {swap(&arr[j], &arr[j + 1]);}for (i = 0; i < len; i++){printf("%d ",arr[i]);}
}

#include<stdio.h>
int main(){int arr[6]={2,5,8,1,6 ,4};int i, j, temp,len=6,d;for (i = 0; i < len - 1; i++)for (j = 0; j < len - 1 - i; j++)if (arr[j] > arr[j + 1]) {d=arr[j];arr[j]=arr[j+1];arr[j+1]=d;}for (i = 0; i < len; i++){printf("%d ",arr[i]);}
}

  • C语言是从0开始计数的,所以第一个数是a[0],也就是2,最后一个是a[5],也就是4,循环n-1遍,for (i = 0; i < 5; i++)——>>(0 1 2 3 4)循环五遍
  • 每次小循环都是从第一个数开始的,所以要for (j = 0; j < len - 1 - i; j++),为什么是len-1-i呢?因为循环了前面 i 次后,就找出来了i个大的数,并按顺序放到了最后,所以这次小循环就不用与他比较了。
#python
def bubbleSort(arr):for i in range(1, len(arr)):for j in range(0, len(arr)-i):if arr[j] > arr[j+1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arr
//C++
template<typename T>
void bubble_sort(T arr[], int len) {int i, j;for (i = 0; i < len - 1; i++)for (j = 0; j < len - 1 - i; j++)if (arr[j] > arr[j + 1])swap(arr[j], arr[j + 1]);
}
//Java* 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。* 如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n 次,* 就完成了 n 个数据的排序工作。**/
public class BubbleSort {public void bubbleSort(Integer[] arr, int n) {if (n <= 1) return;       //如果只有一个元素就不用排序了for (int i = 0; i < n; ++i) {// 提前退出冒泡循环的标志位,即一次比较中没有交换任何元素,这个数组就已经是有序的了boolean flag = false;for (int j = 0; j < n - i - 1; ++j) {        //此处你可能会疑问的j<n-i-1,因为冒泡是把每轮循环中较大的数飘到后面,// 数组下标又是从0开始的,i下标后面已经排序的个数就得多减1,总结就是i增多少,j的循环位置减多少if (arr[j] > arr[j + 1]) {        //即这两个相邻的数是逆序的,交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;flag = true;}}if (!flag) break;//没有数据交换,数组已经有序,退出排序}}public static void main(String[] args) {Integer arr[] = {2, 4, 7, 6, 8, 5, 9};SortUtil.show(arr);BubbleSort bubbleSort = new BubbleSort();bubbleSort.bubbleSort(arr, arr.length);SortUtil.show(arr);}

乾坤大挪移——冒泡法排序,良心之作,拒绝入坑相关推荐

  1. C语言数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插入法排序、折半法排序

    文章目录 1.选择法排序 2.冒泡法排序 3.交换法排序 4.插入排序 5.折半法排序 6.五种方法比较 1.选择法排序 选择法排序是指每次选择索要排序的数组中的最小值(这里是由小到大排序,如果是由大 ...

  2. C语言——冒泡法排序应用

    #include <stdio.h> #include <stdlib.h> int main()/*有int main 就会有return 0;如果是void main ,就 ...

  3. PTA 基础编程题目集 7-27 冒泡法排序 C语言

    PTA 基础编程题目集 7-27 冒泡法排序 C语言 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一 ...

  4. 7-27 冒泡法排序 (C语言)

    7-27 冒泡法排序 (20 分)将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最大的元 ...

  5. 从头学习linux C 冒泡法排序

    下面是一个简单冒泡法排序,代码如下: [cpp] view plaincopy #include <stdio.h> #define LEN 10 int main() { int a,i ...

  6. C语言 数组排序 – 冒泡法排序 - C语言零基础入门教程

    目录 一.简介 二.数组冒泡法排序原理 三.数组冒泡法排序实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 经过前面的学习, ...

  7. 7-27 冒泡法排序 (20 分)

    7-27 冒泡法排序 (20 分) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们.通过一遍扫描,则最后一个元素必定是最大的 ...

  8. 汇编语言---冒泡法排序

    汇编语言冒泡法排序 配置环境 编辑程序 运行程序 后续 配置环境 首先双击下载程序进行下载.(没有安装程序的,可以下载我为大家准备的安装文件.) 不会安装的可以看一下文件 将debug.exe放入C盘 ...

  9. 微课|中学生可以这样学Python(例8.22):冒泡法排序

    适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第8章  常用算法的Python实现 例8.22  冒泡法排序 京东购买链接:https://it ...

最新文章

  1. 罗伯特扫地机器人电池如何取_irobot扫地机器人电池怎么拆 iRobot/艾罗伯特扫地...
  2. python 实现感知器(一)
  3. 浅析phpwind9.0之登陆机制
  4. 中兴zxr10路由器重启命令_蒲公英路由器刷第三方固件(一)
  5. 天呐,这群“员工”的业务能力太强了
  6. opencv-python 鼠标事件和坐标点截图
  7. 【转】解决Navicat 报错:1130-host ... is not allowed to connect to this MySql server,MySQL不允许从远程访问的方法 .
  8. java里赋值语句_java输入赋值语句
  9. 使用Word的VBA功能过滤敏感词,实现网络文章过审
  10. 简单的JSON解析工具
  11. fm核武破解 java出错_java.lang.UnsupportedClassVersionError 错误的原因
  12. PS制作个人LOGO技术总结
  13. AUTOSAR岌岌可危?主机厂+Tier1+初创公司要“联手起义”
  14. Convex Optimization: 3 Convex functions
  15. (一)Activiti 数据库25张表——一般数据1 (ACT_GE_BYTEARRAY)
  16. 瑞萨开发记录01:点亮一颗LED灯(R5F104FEA芯片)
  17. Springboot实现过滤器
  18. 如何写一份优秀的商业计划书
  19. CFS(完全公平调度)
  20. java抓取数据包查询12306余票信息

热门文章

  1. matlab inline feval,matlab中关于函数句柄、feval函数以及inline函数的解析
  2. div旋转45度_为什么不要买旋转式电动牙刷:欧乐B电动牙刷D12开箱与体验
  3. java检索txt文本_lucene索引word/pdf/html/txt文件及检索(搜索引擎)
  4. linux vi脚本,linux下vi(vim)的新的用法总结
  5. micropython flask_在Python的Flask框架中实现单元测试的教程
  6. java线程安全定义了什么单例_Java中四种线程安全的单例模式实现方式
  7. 1.无重复字符的最长子串
  8. python https协议和InsecurePlatformWarning问题
  9. 机器学习笔记(2):线性回归-使用gluon
  10. jstl core and jstl fn