冒泡排序及其升级版---fgriver

冒泡排序作为最基本最简单的排序算法,应用了基础的交换排序,代码如下

void bubble_sort(int*arr,int n)
{
	for(int i = 0;i<n;i++)
	 for(int j = i+1;j<n;j++)
	 {
	 	if(arr[j] > arr[i])
	 	{
	 		int temp = arr[j];
	 		arr[j] = arr[i];
	 		arr[i] = temp;
		 }
	 }
}

如上,冒泡排序虽然简单,但是会浪费更多的时间,那如何稍微降低一下冒泡排序的复杂度呢?
先上代码

void bubble_sort(int* A,int n)
{ 
   int i=0;
   bool exchanged;
   do{ exchanged = false;     //标志  
       for (int j = n - 1; j>=i+1;j--)        
        if (A[j] < A[j-1])
	    { 
	   	  swap(A[j],A[j-1]);
          exchanged=true; 
	    }   
	  i++;
    }while (i<=n-1 && exchanged == true );
}

我们可以设置一个标志记为exchanged,首先标记为false
i 记为大循环的标记,j 记为小循环的标记。
在每一次小循环中,可以从后往前比较,然后如果满足交换条件,就实行交换,然后将标记改为true,这样为大循环的条件做铺垫。
而大循环的条件首先要满足遍历的次数,其次就是满足我们设置的标记是真,否则不满足排序,就中断排序。
给个例子:

int main()
{
	const int n = 10;
	int a[n];
	for(int i = 0;i < n;i++)
	 a[i] = i*i-9*i+5;
	for(int i = 0;i < n;i++)
	 cout<<a[i]<<" ";
	cout<<endl;
	bubble_sort(a,n);
	for(int i = 0;i < n;i++)
	 cout<<a[i]<<" ";
}

在这里插入图片描述
我描述一下第一次的大循环。
首先从数组尾开始比较,直到第四第五位才满足for()的比较,然后进行交换,此时的数组为:
5 -3 -9 -15 -13 -15 -13 -9 -3 5
然后继续遍历,此时的j应该指在了第四位,然后继续满足交换,此时的数组为:
5 -3 -15 -9 -13 -15 -13 -9 -3 5
同上,继续交换,此时的数组为:
5 -15 -3 -9 -13 -15 -13 -9 -3 5
最后进行比较交换,第一次小循环完成时的数组为:
-15 5 -3 -9 -13 -15 -13 -9 -3 5
所以-15被冒泡上来了。
此次的改动虽然不会改变算法的时间复杂度,但是会在小方面提高减少的时间,也就是用空间换时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值