排序算法之冒泡排序(图解)
冒泡排序
- 1.冒泡排序
- wikipedia:
- 2.冒泡排序的步骤
- 第一次迭代
- 之后的迭代
- 3.冒泡排序的实现
- 伪代码
- 助记码
- Python
- Java
- C
- C++
- 4.冒泡排序的复杂度
- 平均复杂度的计算
1.冒泡排序
wikipedia:
冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
为什么介绍用“浮”呢?看它的动图应该就可以理解了。
总结一下就是:比较相邻的两个元素然后交换这两者,一直到一整个数列都按照顺序排列。
2.冒泡排序的步骤
可以先看动图,如果动图就能够理解的话,就不需要看下面的步骤了。
如果觉得动图太快,可以按照下面的步骤一步步理解。
第一次迭代
- 从第一个下标开始,也就是0,比较第一个和第二个元素。
- 如果第一个元素比第二个元素大,那就交换两者。
- 然后比较第二个元素和第三个元素,如果两者也不是升序,那交换两者。
- 一直比较和交换,直到最后。
之后的迭代
冒泡排序就是不断重复迭代的过程,随着不断的交换,大的元素会和动图一样交换到后面,小的元素则会换到前面。下图是第二次迭代。
下图是最后一次迭代,当-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
排序算法之冒泡排序(图解)相关推荐
- 重温经典排序算法之冒泡排序——图解+C/C++实现
目录 1.冒泡排序算法原理: 2.算法性能分析: (1)时间复杂度 (2)算法稳定性 3.图解分析 4.C/C++实现 1.冒泡排序算法原理: [说明]这里实现的冒泡排序算法均为从小到大排序 1.比较 ...
- 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析
[排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...
- 排序算法之冒泡排序(Java版)
排序:即使集合或数组中的元素有序化 本篇介绍最简单.最易掌握的冒泡排序 冒泡排序: 是一种简单的排序算法, 冒泡排序就像学生站队一样,要在老师的引导下,以某位同学位基准,其他学生按身高 ...
- Java排序算法:冒泡排序
Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...
- 排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...
- golang 排序_常用排序算法之冒泡排序
周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
- 数据结构与算法:十大排序算法之冒泡排序
数据结构与算法:十大排序算法之冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换 ...
- 排序算法(1)冒泡排序
排序算法(1)冒泡排序 原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3. ...
- php编写冒泡排序算法_PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
本文实例讲述了PHP排序算法之冒泡排序(Bubble Sort)实现方法.分享给大家供大家参考,具体如下: 基本思想: 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换 ...
最新文章
- SCCM 2012 Part 2 部署前AD准备
- 用Docker搭建Elasticsearch集群
- Object-C中self和super的区别
- 将一个日程分割成多个日程_在家庭日程中开展工作的6个技巧
- Github使用之git回退到某个历史版本
- CW3 Clarifications
- 【 VS 插件开发 】三、Vs插件简单功能的实现
- fiddler 抓包post请求body参数在jmeter中的书写
- 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第1节 网络通信概述_5_端口号...
- ba无标度网络python_python绘制BA无标度网络示例代码
- Linux - 搭建ftp服务器
- ucfirst() strtoupper() strtolower()
- 将STM32 Flash的一部分虚拟为大容量存储设备 USB_Device
- html代码鼠的故事游戏,分享一个html+js实现打地鼠游戏的实例代码
- 2021年十大网络用语发布
- python_飞机大战_main_py_一
- mysql 两个字段相乘_触发将来自不同表的两列与mysql中的函数相乘
- 2021计算机考研科目时间表,2021计算机考研科目408有哪些?
- VBA 图表的基本操作
- 离散型随机变量及其分布列