排序算法之冒泡算法

目录

排序算法介绍

冒泡排序

算法流程

算法实现

python

C++


排序算法介绍

《Hello算法》是GitHub上一个开源书籍,对新手友好,有大量的动态图,很适合算法初学者自主学习入门。而我则是正式学习算法,以这本书为参考,写写笔记,有错误的地方还请指正,下面我会用python和C++实现其中的实例

排序介绍:排序简介 - Hello 算法 (hello-algo.com)

这里有更详细的介绍。 

扫描二维码关注公众号,回复: 14553073 查看本文章

冒泡排序

这是我最开始学习C语言就接触的方法,它是一种最基础的排序算法,非常适合初学者的排序算法。冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

为什么叫“冒泡”

在水中,越大的泡泡浮力越大,所以最大的泡泡会最先浮到水面。

算法流程

那么在实际过程中,具体做法:从数组最左端开始向右遍历,依次对比相邻元素大小,若 左元素 > 右元素 则将它俩交换,最终可将最大元素移动至数组最右端。完成此次冒泡操作后,数组最大元素已在正确位置,接下来只需排序剩余 n−1 个元素

算法实现

下面将以python与C++为例

python

def bubble_sort_with_flag(nums):
    n = len(nums)
    # 外循环:待排序元素数量为 n-1, n-2, ..., 1
    for i in range(n - 1, -1, -1):
        flag = False  # 初始化标志位
        # 内循环:冒泡操作
        for j in range(i):
            if nums[j] > nums[j + 1]:
                # 交换 nums[j] 与 nums[j + 1]
                nums[j], nums[j + 1] = nums[j + 1], nums[j]
                flag = True  # 记录交换元素
        if not flag:
            break  # 此轮冒泡未交换任何元素,直接跳出

C++

void bubbleSortWithFlag(vector<int>& nums) {
    // 外循环:待排序元素数量为 n-1, n-2, ..., 1
    for (int i = nums.size() - 1; i > 0; i--) {
        bool flag = false; // 初始化标志位
        // 内循环:冒泡操作
        for (int j = 0; j < i; j++) {
            if (nums[j] > nums[j + 1]) {
                // 交换 nums[j] 与 nums[j + 1]
                // 这里使用了 std::swap() 函数
                swap(nums[j], nums[j + 1]);
                flag = true;  // 记录交换元素
            }
        }
        if (!flag) break;     // 此轮冒泡未交换任何元素,直接跳出
    }
}

在这里,引进了一个flag变量,并不是所有的排序需要全部进行一次遍历,若在某轮"冒泡"中未执行任何交换操作,则说明数组已经完成排序,可直接返回结果,所有这里引入了一个flag变量,进行检测。

如果你想看看其他语言的代码实现,可以直接去菜鸟教程上面查找。

猜你喜欢

转载自blog.csdn.net/m0_62919535/article/details/128554282