冒泡排序

冒泡排序是很经典的排序算法,记得大一的时候我去参加我们学校的linux兴趣小组,那个时候简直太菜了,人家让我写,我写了半天写不出来,真是o(╯□╰)o

我觉得要掌握冒泡排序及其算法,需要记住两点:

1、         外层循环用来控制比较次数,如n个数,则需要比较n-1

2、         内层循环用来控制相邻两数的比较

void Bubble_sort(int a[], int n)
{
    int i, j, temp;
    for(i = 0; i < n-1; i++)//记住这个n-1次的比较
        for(j = 0; j < n-i-1; j++)//注意每一次都少了一个数,它“冒泡”了
            if(a[j] > a[j+1])
                {
                    temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
}

这段代码当然还有改进的地方,如果需要比较的数为{2,3,1,4,5,6,7,8,9,10…….n-1,n}

从第四个数开始到末尾都是有序的怎么办呢?很明显这个版本的不够精炼了

那我们怎么办呢?我们加一个标志位flag(这种思想很有用,不光是在冒泡排序这一种排序算法),内层循环开始时,即每一趟比较的开始,我们假设都是有序的,flag为true,在比较的过程中,一旦发现无序了,需要交换了,我们就把flag改为false。

代码如下:

void Bubble_sort(int a[], int n)
{
    int i, j, temp;
   bool flag = false;
    for(i = 0; i < n-1 &&!flag; i++)//记住这个n-1次的比较
    {
       flag = true;//每趟开始时假设是有序的
        for(j = 0; j < n-i-1; j++)//注意每一次都少了一个数,它“冒泡”了
            if(a[j] > a[j+1])
                {
                    temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                if(flag)
                        flag = false;//发生了交换,设为无序
                }
    }
}
冒泡排序是稳定的排序,平均和最坏时间复杂度是O(n^2)

最好时间复杂度为O(n),全部有序的情况


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值