冒泡排序优化

冒泡排序的思想是:相邻两个数进行比较,如果反序则进行交换(注意:是从数组的尾部进比较,冒泡冒泡,从底下往上冒),但是会有这种情况出现:需要排序的数组为:{2,1,3,4,5,6,7},当从小到大排序时,当i = 0时,进行第一次循环比较,循环后的结果时:
{1,2,3,4,5,6,7},可以看出,已经正序,顾后续的比较都没有意义,在代码中加一个标记的变量,当有数据交换时证明下一轮循环可能还需要进行比较,当没有数据交换时说明此次循环已经实现正序,后续循环并不需要,结束掉。

代码如下:

void BubbleSort1(int *arr, int n)
{
    int i;
    int j;
    int tmp;
    bool status;
    status = true; //定义一个状态,为true的时候表明有数据交换,为false时,表明没有数据交换

    for (i = 0; (i < n) && (status != 0); i++) //没有数据交换时退出循环,控制每次冒泡的比较次数,例如第一次两两比较7次,第二次冒泡两两比较6次
    {
        status = false;             //第一次没有数据交换,当一整个轮回的比较没有数据交换时,说明此时已经正序,不用进行余下的比较,结束循环
        for (j = n - 1; j > i ; j--) //每次冒泡都从数组的末尾的位置开始,第一次冒泡将最小值冒泡到第一个位置,第二次冒泡将次小值冒泡到第二个位置,此次类推。。。或者从队头开始
        {                           //for (j = 0; j < n-i-1; j++) 从队头开始两两比较往队尾冒泡 if(a[j] > a[j+1]) swap(a[j],a[j+1])
            if (*(arr + j) > *(arr + j - 1))
            {
                tmp = *(arr + j - 1);
                *(arr + j - 1) = *(arr + j);
                *(arr + j) = tmp;
                status = true;
            }
        }
    }

    for (i = 0; i < n; i++)
    {
        printf("%d\n", *(arr + i));
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值