冒泡算法改进--双向冒泡算法 Double Bubble

转载请表明出处http://blog.youkuaiyun.com/yming0221/article/details/6967047


双向冒泡算法比单向冒泡更适用于序列基本有序,但是有小元素在尾部,例如数列

1,2,3,4,5,6,7,8,9,0

如果使用单向冒泡算法,时间复杂度将是O(n^2)

改进的双向冒泡时间复杂度是O(n)

下面是双向冒泡算法的代码

/************************************************************************** * Problem: 双向冒泡算法 * Copyright 2011 by Yan * DATE: * E-Mail: yming0221@gmail.com ************************************************************************/ /* * R[]存放待排序数据,从0开始存放,共n个记录 */ #define bool _Bool #define true 1 #define false 0 void Double_Bubble(int R[],int n) { int i,j; int tmp; bool exchange=true; i=0; while(exchange) { exchange=false; for(j=i;j<n-i-1;j++)//向右扫描 { if(R[j]>R[j+1]) { exchange=true; tmp=R[j];R[j]=R[j+1];R[j+1]=tmp; } } for(j=n-i-1;j>i;j--)//向左扫描 { if(R[j]<R[j-1]) { exchange=true; tmp=R[j];R[j]=R[j-1];R[j-1]=tmp; } } i++;//每趟扫描结束都可以在两头确定一个元素的位置 } }

该算法还能进一步改进,就是在数列的两端设置bound,用于记录最后一次交换的位置,这样可以进一步减少比较次数,进而减小时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值