十大经典排序算法——冒泡排序
对列表中的每一对相邻元素重复上述步骤,直到列表的末尾。这样,最大的元素会被"冒泡"到列表的最后。:忽略已经排序好的最后一个元素,重复上述步骤,直到整个列表排序完成。第二轮结束后,第二大的元素 6 已经"冒泡"到列表的倒数第二位置。第一轮结束后,最大的元素 8 已经"冒泡"到列表的最后。:从列表的第一个元素开始,比较相邻的两个元素。比较 5 和 3,交换位置,列表变为。比较 8 和 4,交换位置,列
冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。该算法的名称来源于较小的元素会像"气泡"一样逐渐"浮"到列表的顶端。
一、算法步骤
-
比较相邻元素:从列表的第一个元素开始,比较相邻的两个元素。
-
交换位置:如果前一个元素比后一个元素大,则交换它们的位置。
-
重复遍历:对列表中的每一对相邻元素重复上述步骤,直到列表的末尾。这样,最大的元素会被"冒泡"到列表的最后。
-
缩小范围:忽略已经排序好的最后一个元素,重复上述步骤,直到整个列表排序完成。
二、 动图演示

假设有一个待排序的列表 [5, 3, 8, 4, 6],冒泡排序的过程如下:
-
第一轮遍历:
-
比较 5 和 3,交换位置,列表变为
[3, 5, 8, 4, 6]。 -
比较 5 和 8,不交换。
-
比较 8 和 4,交换位置,列表变为
[3, 5, 4, 8, 6]。 -
比较 8 和 6,交换位置,列表变为
[3, 5, 4, 6, 8]。 -
第一轮结束后,最大的元素 8 已经"冒泡"到列表的最后。
-
-
第二轮遍历:
-
比较 3 和 5,不交换。
-
比较 5 和 4,交换位置,列表变为
[3, 4, 5, 6, 8]。 -
比较 5 和 6,不交换。
-
第二轮结束后,第二大的元素 6 已经"冒泡"到列表的倒数第二位置。
-
-
第三轮遍历:
-
比较 3 和 4,不交换。
-
比较 4 和 5,不交换。
-
第三轮结束后,列表已经有序。
-
-
第四轮遍历:
-
比较 3 和 4,不交换。
-
列表已经完全有序。
-
三、代码实现
实例
def selection_sort(arr):
n = len(arr)
for i in range(n):
# 假设当前未排序部分的第一个元素是最小值
min_idx = i
# 在未排序部分中查找最小值的索引
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
# 将最小值与未排序部分的第一个元素交换
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
# 示例
arr = [64, 25, 12, 22, 11]
sorted_arr = selection_sort(arr)
print(sorted_arr) # 输出: [11, 12, 22, 25, 64]
JavaScript
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { // 相邻元素两两对比
var temp = arr[j+1]; // 元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
Python
def selectionSort(arr):
for i in range(len(arr) - 1):
# 记录最小数的索引
minIndex = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[minIndex]:
minIndex = j
# i 不是最小数时,将 i 和最小数进行交换
if i != minIndex:
arr[i], arr[minIndex] = arr[minIndex], arr[i]
return arr
Go
func bubbleSort(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
for j := 0; j < length-1-i; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
return arr
}
Java
public class BubbleSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
// 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
for (int i = 1; i < arr.length; i++) {
// 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
boolean flag = true;
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = false;
}
}
if (flag) {
break;
}
}
return arr;
}
}
PHP
function bubbleSort($arr)
{
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
for ($j = 0; $j < $len - 1 - $i; $j++) {
if ($arr[$j] > $arr[$j+1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
return $arr;
}
C
#include <stdio.h>
void bubble_sort(int arr[], int len) {
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int main() {
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, len);
int i;
for (i = 0; i < len; i++)
printf("%d ", arr[i]);
return 0;
}
C++
#include <iostream>
using namespace std;
template<typename T> //整数或浮点数皆可使用,若要使用类(class)或结构体(struct)时必须重载大于(>)运算符
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]);
}
int main() {
int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
int len = (int) sizeof(arr) / sizeof(*arr);
bubble_sort(arr, len);
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
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 };
len = (float) sizeof(arrf) / sizeof(*arrf);
bubble_sort(arrf, len);
for (int i = 0; i < len; i++)
cout << arrf[i] << ' '<<endl;
return 0;
}
C#
static void BubbleSort(int[] intArray) {
int temp = 0;
bool swapped;
for (int i = 0; i < intArray.Length; i++)
{
swapped = false;
for (int j = 0; j < intArray.Length - 1 - i; j++)
if (intArray[j] > intArray[j + 1])
{
temp = intArray[j];
intArray[j] = intArray[j + 1];
intArray[j + 1] = temp;
if (!swapped)
swapped = true;
}
if (!swapped)
return;
}
}
Rust
fn bubble_sort<T:Ord + Debug>(array: &mut [T]) {
for i in 0..array.len() {
for j in 0..array.len() - i - 1 {
if array[j] > array[j + 1] {
array.swap(j, j + 1);
}
println!("{:?}", array);
}
}
}
Ruby
class Array
def bubble_sort!
for i in 0...(size - 1)
for j in 0...(size - i - 1)
self[j], self[j + 1] = self[j + 1], self[j] if self[j] > self[j + 1]
end
end
self
end
end
puts [22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70].bubble_sort!
Swift
import Foundation
func bubbleSort (arr: inout [Int]) {
for i in 0..<arr.count - 1 {
for j in 0..<arr.count - 1 - i {
if arr[j] > arr[j+1] {
arr.swapAt(j, j+1)
}
}
}
}
// 测试调用
func testSort () {
// 生成随机数数组进行排序操作
var list:[Int] = []
for _ in 0...99 {
list.append(Int(arc4random_uniform(100)))
}
print("\(list)")
bubbleSort(arr:&list)
print("\(list)")
}
四、复杂度
1. 时间复杂度
-
最坏情况:O(n²),当列表是逆序时。
-
最好情况:O(n),当列表已经有序时。
-
平均情况:O(n²)。
2. 空间复杂度
-
O(1),因为冒泡排序是原地排序算法,不需要额外的存储空间。
五、优缺点
-
优点:
-
实现简单,代码易于理解。
-
原地排序,不需要额外的存储空间。
-
-
缺点:
-
效率较低,尤其是对于大规模数据集。
-
不适合处理几乎已经有序的列表,因为仍然需要进行多次遍历。
-
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)