1.1 冒泡排序

分类 算法

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢”浮”到数列的顶端。
作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来
说并没有什么太大作用。

1. 算法步骤

比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2. 动图演示

img

3. 什么时候最快

当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊)。

4. 什么时候最慢

当输入的数据是反序时(写一个 for 循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗)。

5. JavaScript 代码实现

实例

  1. function bubbleSort(arr) {
  2. var len = arr.length;
  3. for (var i = 0; i < len - 1; i++) {
  4. for (var j = 0; j < len - 1 - i; j++) {
  5. if (arr[j] > arr[j+1]) { // 相邻元素两两对比
  6. var temp = arr[j+1]; // 元素交换
  7. arr[j+1] = arr[j];
  8. arr[j] = temp;
  9. }
  10. }
  11. }
  12. return arr;
  13. }

6. Python 代码实现

实例

  1. def bubbleSort(arr):
  2. for i in range(1, len(arr)):
  3. for j in range(0, len(arr)-i):
  4. if arr[j] > arr[j+1]:
  5. arr[j], arr[j + 1] = arr[j + 1], arr[j]
  6. return arr

7. Go 代码实现

实例

  1. func bubbleSort(arr []int) []int {
  2. length := len(arr)
  3. for i := 0; i < length; i++ {
  4. for j := 0; j < length-1-i; j++ {
  5. if arr[j] > arr[j+1] {
  6. arr[j], arr[j+1] = arr[j+1], arr[j]
  7. }
  8. }
  9. }
  10. return arr
  11. }

8. Java 代码实现

实例

  1. public class BubbleSort implements IArraySort {
  2. @Override
  3. public int[] sort(int[] sourceArray) throws Exception {
  4. // 对 arr 进行拷贝,不改变参数内容
  5. int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
  6. for (int i = 1; i < arr.length; i++) {
  7. // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
  8. boolean flag = true;
  9. for (int j = 0; j < arr.length - i; j++) {
  10. if (arr[j] > arr[j + 1]) {
  11. int tmp = arr[j];
  12. arr[j] = arr[j + 1];
  13. arr[j + 1] = tmp;
  14. flag = false;
  15. }
  16. }
  17. if (flag) {
  18. break;
  19. }
  20. }
  21. return arr;
  22. }
  23. }

9. PHP 代码实现

实例

  1. function bubbleSort($arr)
  2. {
  3. $len = count($arr);
  4. for ($i = 0; $i < $len - 1; $i++) {
  5. for ($j = 0; $j < $len - 1 - $i; $j++) {
  6. if ($arr[$j] > $arr[$j+1]) {
  7. $tmp = $arr[$j];
  8. $arr[$j] = $arr[$j+1];
  9. $arr[$j+1] = $tmp;
  10. }
  11. }
  12. }
  13. return $arr;
  14. }

10. C 语言

实例

  1. #include <stdio.h>
  2. void bubble_sort(int arr[], int len) {
  3. int i, j, temp;
  4. for (i = 0; i < len - 1; i++)
  5. for (j = 0; j < len - 1 - i; j++)
  6. if (arr[j] > arr[j + 1]) {
  7. temp = arr[j];
  8. arr[j] = arr[j + 1];
  9. arr[j + 1] = temp;
  10. }
  11. }
  12. int main() {
  13. int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
  14. int len = (int) sizeof(arr) / sizeof(*arr);
  15. bubble_sort(arr, len);
  16. int i;
  17. for (i = 0; i < len; i++)
  18. printf("%d ", arr[i]);
  19. return 0;
  20. }

11. C++ 语言

实例

  1. #include <iostream>
  2. using namespace std;
  3. template<typename T> //整数或浮点数皆可使用,若要使用类(class)或结构体(struct)时必须重载大于(>)运算符
  4. void bubble_sort(T arr[], int len) {
  5. int i, j;
  6. for (i = 0; i < len - 1; i++)
  7. for (j = 0; j < len - 1 - i; j++)
  8. if (arr[j] > arr[j + 1])
  9. swap(arr[j], arr[j + 1]);
  10. }
  11. int main() {
  12. int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
  13. int len = (int) sizeof(arr) / sizeof(*arr);
  14. bubble_sort(arr, len);
  15. for (int i = 0; i < len; i++)
  16. cout << arr[i] << ' ';
  17. cout << endl;
  18. float arrf[] = { 17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
  19. len = (float) sizeof(arrf) / sizeof(*arrf);
  20. bubble_sort(arrf, len);
  21. for (int i = 0; i < len; i++)
  22. cout << arrf[i] << ' '<<endl;
  23. return 0;
  24. }

12. C#

实例

  1. static void BubbleSort(int[] intArray) {
  2. int temp = 0;
  3. bool swapped;
  4. for (int i = 0; i < intArray.Length; i++)
  5. {
  6. swapped = false;
  7. for (int j = 0; j < intArray.Length - 1 - i; j++)
  8. if (intArray[j] > intArray[j + 1])
  9. {
  10. temp = intArray[j];
  11. intArray[j] = intArray[j + 1];
  12. intArray[j + 1] = temp;
  13. if (!swapped)
  14. swapped = true;
  15. }
  16. if (!swapped)
  17. return;
  18. }
  19. }

13. Ruby

实例

  1. class Array
  2. def bubble_sort!
  3. for i in 0...(size - 1)
  4. for j in 0...(size - i - 1)
  5. self[j], self[j + 1] = self[j + 1], self[j] if self[j] > self[j + 1]
  6. end
  7. end
  8. self
  9. end
  10. end
  11. puts [22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70].bubble_sort!

14. Swift

实例

  1. import Foundation
  2. func bubbleSort (arr: inout [Int]) {
  3. for i in 0..<arr.count - 1 {
  4. for j in 0..<arr.count - 1 - i {
  5. if arr[j] > arr[j+1] {
  6. arr.swapAt(j, j+1)
  7. }
  8. }
  9. }
  10. }
  11. *// 测试调用*
  12. func testSort () {
  13. *// 生成随机数数组进行排序操作*
  14. var list:[Int] = []
  15. for _ in 0...99 {
  16. list.append(Int(arc4random_uniform(100)))
  17. }
  18. print("\(list)")
  19. bubbleSort(arr:&list)
  20. print("\(list)")
  21. }

哔哩哔哩动画

原文地址:https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/1.bubbleSort.md

参考地址:https://zh.wikipedia.org/wiki/冒泡排序