冒泡排序(Bubble Sort)

简介: 算法介绍算法描述动图演示算法分析代码实现算法优化参考

算法介绍


     冒泡排序是一种最基础的交换排序(两两比较待排序的关键字,交换不满足次序要求的那对数,直到整个表都满足次序要求为止),工作方式如同碳酸饮料中的二氧化碳气泡最终会上浮到顶端一样,故名"冒泡排序"。


算法描述


      一次比较相邻的数据,将小数据放在前(假设非递减排列),大数据放在后。即第一趟比较第1个和第2个数,小数在前,大数在后,再比较第2个数与第3个数,小数在前,大数在后,以此类推比较第n - 1个和第n个数,小数在前,大数在后;第一趟后最大元素已放在正确位置,以此类推,直到全部元素放在正确的位置。


动图演示


20210515141535863.gif



算法分析


 时间复杂度:O(N2)


 空间复杂度:O(1)


 稳定性:稳定


代码实现

// C++
void bubbleSort(int a[], int length) {
    // i表示这一趟要填入正确元素的位置,最后一个位置不需要比较
    // 因为n-1个元素在正确位置,最后一个位置自然填入正确元素
    for (int i = 0; i < length - 1; ++i) {
        // 从后往前依次比较,将最小元素"冒泡"到最前方,要填入正确元素的位置i
        for (int j = length - 1; j > i; --j) {
    // 交换不满足次序要求的元素
            if (a[j] < a[j - 1]) { 
                int temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }
        }

 

算法优化


考虑一些特殊情况


 1、待排序序列已经有序,整个代码任然会执行无效的遍历和比较。


 2、数据已经排好序,但任然会进行下一轮比较,直到length-1次,后面的比较都是无意义的。


 可以通过设置标志位flag,如果发生了交换就改变flag设置为true,如果没有交换就保持false。当一轮比较结束后如果flag仍为false,即:这一轮没有发生交换,说明数据的顺序已经排好,没有必要继续进行下去。退出循环,排序完成。


// C++
void bubbleSort2(int a[], int length) {
    bool flag = false;  // 标记第i趟是否发生元素交换
    // i表示这一趟要填入正确元素的位置,最后一个位置不需要比较
    // 因为n-1个元素在正确位置,最后一个位置自然填入正确元素
    for (int i = 0; i < length - 1; ++i) {
        flag = false;  // 每趟默认未进行元素交换
        // 从后往前依次比较,将最小元素"冒泡"到最前方,要填入正确元素的位置i
        for (int j = length - 1; j > i; --j) {
            if (a[j] < a[j - 1]) {  // 交换不满足次序要求的元素
                flag = true;  // 发生元素交换,改变flag
                int temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }
        }
        if (flag == false) {  // 未发生交换,序列满足要求,完成排序
            break;  // 跳出循环
        }
    }
}


参考


数据结构与算法分析(Java语言描述)

数据结构(C语言版)

————————————————

版权声明:本文为CSDN博主「Acx7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Acx77/article/details/116848665

相关文章
|
3天前
|
搜索推荐 算法 Java
sort-01-bubble sort 冒泡排序算法详解
这是一个关于排序算法的系列文章摘要。作者整理了10种不同的排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序和大文件外部排序。文章详细介绍了冒泡排序的工作原理、流程,并提供了代码实现,强调了在实现中考虑的改进点,如统一接口、实用性增强和日志输出。此外,还提供了一个排序接口和工具类以方便使用,并通过测试代码和日志展示了排序过程。整个系列旨在帮助读者理解和掌握排序算法。相关代码已开源在GitHub。
|
3天前
|
搜索推荐 算法 Java
sort-02-QuickSort 快速排序到底快在哪里?
这是一个关于排序算法的系列文章的摘要。文章详细介绍了各种排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及处理大文件的外部排序。特别强调了快速排序,它是1959年由Tony Hoare发明的,平均时间复杂度为O(n log n),优于其他如合并排序和堆排序。快速排序采用分而治之的策略,选取基准元素,通过分区操作将数组分成两部分,然后递归地对这两部分进行排序。文章还通过示例和Java代码解释了快速排序的步骤和实现。最后,提供了开源项目的链接,供读者进一步学习和研究。
|
3天前
|
搜索推荐 算法 Java
sort-03-SelectSort 选择排序算法详解
这是一个关于排序算法的系列文章摘要,包括了各种排序算法的介绍和Java实现。文章列举了冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序的链接和简要说明。其中,选择排序算法被详细解释,它是通过找到未排序序列中的最小元素并将其放到正确位置来逐步构建有序序列的。Java实现中,选择排序的`doSort`方法通过两层循环实现,时间复杂度为`O(N^2)`,是稳定的排序算法。整个排序项目已开源在GitHub。
|
7月前
|
算法 编译器 C语言
qsort函数 - (Quick Sort)【快速排序的使用方法】
qsort函数 - (Quick Sort)【快速排序的使用方法】
|
10月前
|
存储 算法 搜索推荐
|
11月前
|
搜索推荐 C语言
快排函数 -- qsort函数(Quick Sort)
快排函数 -- qsort函数(Quick Sort)
87 0
C中的快速排序qsort()
以前我所有的排序都是用的冒泡排序,因为那时觉得冒泡排序结构简单,还容易理解,真的是解决排序一头雄狮,自从遇见qsort(),我就知道这位草原霸主的地位已经不保了。
|
算法 搜索推荐 编译器
排序函数qsort和sort那点事
排序函数qsort和sort那点事
110 0
2-路插入排序(Two-Way Insertion Sort)
算法介绍 算法描述 算法分析 代码实现 参考
|
搜索推荐 算法 数据可视化
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)
76 0
【基础篇】9 # 排序:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、选择排序(Selection Sort)