排序算法——冒泡排序

一、冒泡排序的基本思想

冒泡排序(Bubble Sort)是一种简单直观的排序算法。它的原理是重复地走访要排序的数列,一次比较两个相邻元素,如果它们的顺序不是预期的顺序就交换它们。这个过程持续进行,直到没有再需要交换,也就是说该数列已经排序完成。

二、实例讲解

第四轮过后,将第四大的元素位置确定,此时总共5个元素,已经排序好4个,从而最后一个自然而然就是排好序的了

三、算法步骤总结

设总的元素个数为n,那么由上边的排序过程可以看出:

(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环

(2)每轮排序比较的次数逐轮减少

(3)如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。(详见下边优化部分)

四、代码实现

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);
    for (int i = 0; i < len; i++){
        printf("%d ", arr[i]);
    }
    return 0;
}

五、算法优化

通过上边讲解的例子,我们也可以看出从第二轮过后,其实数组已经是有序的了,但是按照算法步骤来走的话,即使已经排好序了,但仍是会进行后边的比较,知道全部比较完成。

因此,我们可以对代码进行优化,如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。

解决方式:可以通过一个标志位来进行判断

下面是优化后的代码:

c 复制代码
#include <stdio.h>

void bubble_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++) {
        int swap_flag = false;
        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;
                swap_flag = true;
            }
        }
        if(!swap_flag){
            break;
        }
    }
}

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);
    for (int i = 0; i < len; i++){
        printf("%d ", arr[i]);
    }
    return 0;
}
相关推荐
步达硬件8 小时前
【matlab】代码库-查找递增列表中目标临近数据位置
matlab·排序算法
立志成为大牛的小牛16 小时前
数据结构——五十八、希尔排序(Shell Sort)(王道408)
数据结构·学习·程序人生·考研·算法·排序算法
roman_日积跬步-终至千里2 天前
【计算机算法与设计(4)】排序算法的原理和方法,以及寻找一个长序列中前k个最大数所运用的方法
数据结构·算法·排序算法
墨有6662 天前
用栈模拟递归:以快速排序为例,告别栈溢出烦恼
数据结构·算法·排序算法
天赐学c语言2 天前
12.9 - 排序数组 && 野指针和空指针的区别
c++·算法·排序算法·leecode
添加shujuqudong1如果未回复3 天前
永磁同步电机匝间短路故障的Simulink仿真
排序算法
CQ_YM3 天前
数据结构之排序
c语言·数据结构·算法·排序算法
2401_860494703 天前
在React Native鸿蒙跨平台开发中实现一个桶排序算法,如何使用任何排序算法对每个桶中的元素进行排序,再将所有桶中的元素合并成一个有序数组
javascript·react native·react.js·ecmascript·排序算法·harmonyos
2401_860494703 天前
在React Native鸿蒙跨平台开发中实现一个选择排序算法,如何实现列表项重排序,如任务管理应用中调整任务的优先级
react native·排序算法·harmonyos