排序——冒泡排序

冒泡排序

代码

#include<iostream>
using namespace std;

void swap(int &m,int &n){
    int temp;
    temp = m;
    m = n;
    n = temp;
}

int main(){
    int n;
    cin >> n;
    int a[n];
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    //从小到大排序
    //核心代码部分
    for(int i = 0; i < n-1; i++)
        for(int j = 0; j < n-i-1; j++)
            if(a[j]>a[j+1])
                swap(a[j],a[j+1]);
    
    for(int i = 0; i < n; i++)
        cout << a[i] << " ";
    return 0;
}

分析

  1. 算法的大致行为是通过两层循环,从头到尾,每两个元素两两比较,如果顺序相反,两个元素就交换,然后再往后看,最后效果上呈现为数组从尾部开始,依次往前顺序依次排好,最后数组头部再排好,整个过程就完成了。

  2. i<n-1表示i最大能为n-2j<n-i-1表示j最大只能为n-i-2

    • 其中i可以理解为尾部已经排好顺序的元素个数j则是在头部未排好序的元素中遍历。
    • i=0时,表示已有0个元素已排好序,即当前为第一轮排序。j最大能为n-2j+1则为n-1,逻辑地址则为n,所以能遍历到最后一个元素。
    • i=n-2时,表示已有n-2个元素已排好序,还剩两个元素未排序,即当前为最后一轮排序。j最大能为0j+1则为1,逻辑地址则为2,则jj+1分别表示第一个和第二个元素,所以最后两个元素也可以进行比较。
  3. 如果a[j]>a[j+1],则两个元素进行交换,j++之后的a[j]就是之前二者之间较大的那个数,再将其与其后的元素进行比较,依次往后,就会让最大的数出现在最后。如果a[j]<a[j+1],则两个元素不做任何操作,j++之后,a[j]依然是之前二者之间较大的数,同上。

  4. 时间复杂度 T(n) = O(n2),如无特殊时间要求,此方法还是比较好理解的。

以上内容如有错误之处,还请大家指正!以求进步,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万宝炉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值