冒泡算法是一种基础的排序算法,其核心思想是反复交换相邻元素,如同水中的气泡逐渐上浮。它通过多轮遍历,在每一轮中依次比较相邻的两个元素,如果它们的顺序错误(例如前一个比后一个大),就交换它们的位置,这样每一轮遍历都会将当前未排序部分中的最大(或最小)元素“浮”到正确的一端(末端)。这个过程不断重复,直到某一轮遍历中没有发生任何交换,表明序列已经完全有序,其时间复杂度为 O(n²),效率较低。


1. C/C++版代码:

void bubbleSort(int arr[], int n) {
    int i, j, temp;
    int swapped; // 优化标志
    
    for (i = 0; i < n - 1; i++) {      // 外层循环:n-1轮
        swapped = 0;
        
        // 内层循环:相邻元素比较交换
        for (j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {  // 逆序则交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;
            }
        }
        
        if (!swapped) break;           // 提前终止:本轮无交换说明已有序
    }
}


2. Java版代码:

public class BubbleSort {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped; // 优化标志:记录本轮是否发生交换
        
        // 外层循环:最多需要n-1轮排序
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            
            // 内层循环:比较相邻元素,将较大元素"冒泡"到右侧
            // 每轮结束后,右侧i个元素已处于最终位置
            for (int j = 0; j < n - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {  // 如果逆序,则交换
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;        // 标记发生交换
                }
            }
            
            // 提前终止优化:若本轮无交换,说明数组已完全有序
            if (!swapped) {
                break;
            }
        }
    }
}


3. Python版代码:

def bubble_sort(arr):
    # 冒泡排序:通过相邻元素比较交换,将最大元素逐步"冒泡"到右侧
    
    n = len(arr)
    
    # 外层循环:最多需要n-1轮排序
    for i in range(n - 1):
        swapped = False  # 优化标志:记录本轮是否发生交换
        
        # 内层循环:比较相邻元素,将较大元素向右移动
        # 每轮结束后,右侧i个元素已处于最终有序位置
        for j in range(n - 1 - i):
            if arr[j] > arr[j + 1]:   # 发现逆序对,交换位置
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True        # 标记本轮发生交换
        
        # 提前终止优化:若本轮无交换,说明数组已完全有序
        if not swapped:
            break
点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)