冒泡排序

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

1.冒泡排序

wikipedia:

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

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

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

2.冒泡排序的步骤

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

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

第一次迭代

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

之后的迭代

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

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

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 Pythondef bubbleSort(array):# loop to access each array elementfor i in range(len(array)):# loop to compare array elementsfor j in range(0, len(array) - i - 1):# compare two adjacent elements# change > to < to sort in descending orderif array[j] > array[j + 1]:# swapping elements if elements# are not in the intended ordertemp = array[j]array[j] = array[j+1]array[j+1] = tempdata = [-2, 45, 0, 11, -9]bubbleSort(data)print('Sorted Array in Ascending Order:')
print(data)

Java

// Bubble sort in Javaimport java.util.Arrays;class Main {// perform the bubble sortstatic void bubbleSort(int array[]) {int size = array.length;// loop to access each array elementfor (int i = 0; i < size - 1; i++)// loop to compare array elementsfor (int j = 0; j < size - i - 1; j++)// compare two adjacent elements// change > to < to sort in descending orderif (array[j] > array[j + 1]) {// swapping occurs if elements// are not in the intended orderint 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 nameMain.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 elementfor (int step = 0; step < size - 1; ++step) {// loop to compare array elementsfor (int i = 0; i < size - step - 1; ++i) {// compare two adjacent elements// change > to < to sort in descending orderif (array[i] > array[i + 1]) {// swapping occurs if elements// are not in the intended orderint 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 lengthint 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 elementfor (int step = 0; step < size; ++step) {// loop to compare array elementsfor (int i = 0; i < size - step; ++i) {// compare two adjacent elements// change > to < to sort in descending orderif (array[i] > array[i + 1]) {// swapping elements if elements// are not in the intended orderint 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 lengthint size = sizeof(data) / sizeof(data[0]);bubbleSort(data, size);cout << "Sorted Array in Ascending Order:\n";  printArray(data, size);
}

4.冒泡排序的复杂度

时间复杂度
最优 O(n)
最坏 O(n2n^2n2)
平均 O(n2n^2n2)
空间复杂度 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

基本上等于n2n^2n2

排序算法之冒泡排序(图解)相关推荐

  1. 重温经典排序算法之冒泡排序——图解+C/C++实现

    目录 1.冒泡排序算法原理: 2.算法性能分析: (1)时间复杂度 (2)算法稳定性 3.图解分析 4.C/C++实现 1.冒泡排序算法原理: [说明]这里实现的冒泡排序算法均为从小到大排序 1.比较 ...

  2. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

  3. 排序算法之冒泡排序(Java版)

    排序:即使集合或数组中的元素有序化 本篇介绍最简单.最易掌握的冒泡排序 冒泡排序:         是一种简单的排序算法, 冒泡排序就像学生站队一样,要在老师的引导下,以某位同学位基准,其他学生按身高 ...

  4. Java排序算法:冒泡排序

    Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...

  5. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  6. golang 排序_常用排序算法之冒泡排序

    周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...

  7. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  8. 数据结构与算法:十大排序算法之冒泡排序

    数据结构与算法:十大排序算法之冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换 ...

  9. 排序算法(1)冒泡排序

    排序算法(1)冒泡排序 原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3. ...

  10. php编写冒泡排序算法_PHP排序算法之冒泡排序(Bubble Sort)实现方法详解

    本文实例讲述了PHP排序算法之冒泡排序(Bubble Sort)实现方法.分享给大家供大家参考,具体如下: 基本思想: 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换 ...

最新文章

  1. SCCM 2012 Part 2 部署前AD准备
  2. 用Docker搭建Elasticsearch集群
  3. Object-C中self和super的区别
  4. 将一个日程分割成多个日程_在家庭日程中开展工作的6个技巧
  5. Github使用之git回退到某个历史版本
  6. CW3 Clarifications
  7. 【 VS 插件开发 】三、Vs插件简单功能的实现
  8. fiddler 抓包post请求body参数在jmeter中的书写
  9. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第1节 网络通信概述_5_端口号...
  10. ba无标度网络python_python绘制BA无标度网络示例代码
  11. Linux - 搭建ftp服务器
  12. ucfirst() strtoupper() strtolower()
  13. 将STM32 Flash的一部分虚拟为大容量存储设备 USB_Device
  14. html代码鼠的故事游戏,分享一个html+js实现打地鼠游戏的实例代码
  15. 2021年十大网络用语发布
  16. python_飞机大战_main_py_一
  17. mysql 两个字段相乘_触发将来自不同表的两列与mysql中的函数相乘
  18. 2021计算机考研科目时间表,2021计算机考研科目408有哪些?
  19. VBA 图表的基本操作
  20. 离散型随机变量及其分布列

热门文章

  1. electron 自定义标题栏_CAXA电子图板2015版自定义标题栏
  2. MAC配置thinkPHP的心路历程(课设vue-tpadmin商城)
  3. Java实现 LeetCode 75 颜色分类
  4. altium designer2020安装教程
  5. 纬地道路纵断面设计教程_道路BIM模型快速生成
  6. Laravel快速入门
  7. Linux系统添加用户、管理员权限
  8. python数据分析的常用方法_16种常用的数据分析方法汇总
  9. 性能测试--网页fps测试
  10. mariaDB安装与配置