排序算法I(冒泡排序)

1.什么是冒泡排序?

冒泡排序(Bubble Sort),是一种 计算机科学领域的较简单的 排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的 元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中 二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 

总的来说,就是一句话:

通过不断比较相邻元素,将大的元素放到数组后面,最终完成排序。

文字解释

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

那么接下来我们就举个例子来证明冒泡排序的过程:

2.怎么做?

设有六个数,分别为 2 3 5 6 1 4

接下来进行操作演示:

①:2 3 5 1 6 4

②: 2 3 1 5 4 6

③:2 1 3 4 5 6

④:1 2 3 4 5 6

这样的话冒泡排序就完成了

3.时间复杂度

在冒泡排序中,第 1 轮需要比较 n -1 次,第 2 轮需要比较 n -2 次……第 n -1 轮需 要比较 1 次。因此,总的比较次数为 (n -1) +(n -2) +…+1 ≈ (n^2)/2。这个比较次数恒定为该数值,和输入数据的排列顺序无关。

不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输 入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要 是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时间复杂度为 O(n^2 )。

4.两种不同的比较方法

相信大家都注意到了,文字说明与图文混合说明比较顺序是不同的。一个是把最大,第二大,第三大,...第n大依次放到后面;一个是把最小,第二小,...,第n小依次冒到前面。

不过,它们都是冒泡排序!

5.代码实现

#include <iostream>
#include <vector>
 
using namespace std;
 
void bubbleSort(vector<int>& nums) {
    int n = nums.size();
    bool swapped;
 
    for (int i = 0; i < n-1; i++) {
        swapped = false;
        
        for (int j = 0; j < n-i-1; j++) {
            if (nums[j] > nums[j+1]) {
                swap(nums[j], nums[j+1]);
                swapped = true;
            }
        }
 
        // 如果一轮遍历没有发生交换,说明序列已经有序,提前结束排序
        if (!swapped) {
            break;
        }
    }
}
 
int main() {
    vector<int> nums = {5, 2, 9, 1, 3};
 
    cout << "原始序列:";
    for (int num : nums) {
        cout << num << " ";
    }
    cout << endl;
 
    bubbleSort(nums);
 
    cout << "排序后序列:";
    for (int num : nums) {
        cout << num << " ";
    }
    cout << endl;
 
    return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

文章参考(鸣谢):

c++排序算法——冒泡排序(不会的一定要看,超级详细)_c++冒泡排序-CSDN博客

c++冒泡排序详解-CSDN博客

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值