冒泡排序的基本思路

冒泡排序

基本冒泡排序:
就是将数组中的元素两两进行对比,比出大小,按顺序进行交换,没有比出则不进行任何操作。这个算法是比较简单暴力的,但是不推荐使用,因为这种算法是时间消耗最多,同时也做了很多无用功。

void BubbleSort_first(SqList* L) 
{
    for (int i = 1; i <= L->length; i++) 
    {     //Array[0]用作存储数组长度,所以从i = 1开始
        for (int j = 1; j <= L->length; j++) 
        {
            if (L->Array[i] > L->Array[j]) 
            {
                swap(L, i, j);	//交换L->Array[i]>L->Array[j]的位置
            }
        }
    }
}

对于代码的解释好比下图:
在这里插入图片描述
在这里插入图片描述
是不是每层遍历都要把所有元素再次进行遍历,已经排好的位置的元素在接下来的几层遍历中又进行了无用的比较,所以说它的效率太低了,我们可以对它进行优化一下。

void BubbleSort_second(SqList* L) 
{
    for (int i = 1; i <= L->length; i++) 
    {   //Array[0]用作存储数组长度,所以从i = 1开始
        for (int j = L->length - 1; j >= i; j--) 
        {
            if (L->Array[j] > L->Array[j + 1]) 
            {
                swap(L, j, j+1);	//交换L->Array[i]>L->Array[j]的位置
            }
        }
    }
}

可能有人对for(int j = L->length-1;j >= i;j++)产生疑问(指代的是小白,大佬请忽略🌝​),我们之前是从前往后遍历,这次只不过是换了一遍历开端,我们从尾部遍历,这样来看是不是有一种冒泡的感觉。并且我们对于i以前已经排序号的序列在此也不做比较了。
在这里插入图片描述
当然,还能够对这个冒泡排序继续优化,不过不是省略已经排好的元素在的步骤,而是对于未排序且已经按照预定的顺序排好的元素,这些步骤也可以省略,比如我们此时的数组为{3,2,1,4,5,6,7,8,9}从第4个元素位置开始后边的元素已经按照从小到大的顺序拍好了,我们是不是也可以省略其步骤。

void BubbleSort_third(SqList* L) 
{
    int flag = TRUE;
    for (int i = 1; i <= L->length && flag; i++)   
    {    //Array[0]用作存储数组长度,所以从i = 1开始
        flag = FALSE;
        for (int j = L->length - 1; j >= i; j--) 
        {
            if (L->Array[j] > L->Array[j + 1]) 
            {
                swap(L, j, j+1);	//交换L->Array[i]>L->Array[j]的位置
                flag = TRUE;
            }
        }
    }
}

不过对于以上的时间复杂度都为O(n²),并不是说三种算法不还是一样的,毕竟能减少一点对于你来说来说不算什么,但是对于计算机来说,假如有个千万级的数据需要排序,恐怕电脑不是冒烟就是在冒烟的路上,好了,以上是我对于冒泡排序的见解,如果还有更好的算法,欢迎来交流~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值