浅议冒泡排序及其优化方法Word文档格式.docx
- 文档编号:22039713
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:8
- 大小:16.51KB
浅议冒泡排序及其优化方法Word文档格式.docx
《浅议冒泡排序及其优化方法Word文档格式.docx》由会员分享,可在线阅读,更多相关《浅议冒泡排序及其优化方法Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
//待排序部分数组的上边界,即lib[0..high]为待排序部分,lib[high+1..n-1]为已排序部分
inttemp;
//用来交换数组元素值的临时变量
inti;
for(high=n-1;
high>
0;
high--)//外层循环控制待排序部分数组的上边界,每完成一趟冒泡,上边界下移一个位置
for(i=0;
i<
high;
i++)//内层循环扫描待排序部分数组,比较相邻元素,并通过交换元素值的方式将最大值顶到最上方
if(lib[i]>
lib[i+1])
{
temp=lib[i];
lib[i]=lib[i+1];
lib[i+1]=temp;
}
}
二,冒泡排序第一步优化
在基础冒泡法中,外层循环控制待排序部分数组的上边界,每完成一趟冒泡,上边界下移一个位置,使得待排序列的长度减1,直到待排序列的长度为1,排序完成。
内层循环扫描待排序部分数组,比较相邻元素,并通过交换元素值的方式将最大值顶到最上方。
对一个有n个元素的序列,基础冒泡法比较次数为,这是最坏的时间复杂度。
实际上,如果待排序列本身是增序的,冒泡过程中根本不需要交换元素,一趟扫描即可完成排序,时间复杂度应该为,这是最好的时间复杂度。
我们可以增加一个交换标志,判断在内层循环中是否进行了交换操作,若未进行交换操作,说明排序已经完成。
这样可以减少不必要的重复扫描。
改进版代码如下:
voidBubbleSort_2(intlib[],intn)//改进版1:
设置交换标志,以便提前结束扫描
inthigh;
inttemp;
intSwapFlag;
//交换标志
inti;
for(high=n-1;
high>
SwapFlag=0;
//设置交换标志
for(i=0;
i++)
if(lib[i]>
temp=lib[i];
lib[i]=lib[i+1];
lib[i+1]=temp;
SwapFlag=1;
//该处发生了交换操作
if(SwapFlag==0)//若未进行交换操作,说明排序已经完成,提前结束扫描工作
break;
三,冒泡排序第二步优化
我们通过一个实例来分析“/改进版1”中排序的过程。
待排序数组:
lib[8]={3,2,1,4,5,6,7,8}。
high=7。
第一趟冒泡后:
lib[8]={2,1,3,4,5,6,7,8}。
high=6。
最后一次交换的元素是lib[1]和lib[2]。
第二趟冒泡后:
lib[8]={1,2,3,4,5,6,7,8}。
high=5。
最后一次交换的元素是lib[0]和lib[1]。
第三趟冒泡后:
没有交换元素,排序完成。
仔细观察冒泡的过程,我们发现在第一趟冒泡过程中,lib[3..7]序列中的元素未发生交换,即这段序列的元素已经是有序的了,在第二趟冒泡时,程序扫描的待排序列为lib[0..6],而实际上我们只需扫描序列lib[0..2]即可。
也就是说,若靠近已排序部分的数组成员未做交换操作,则说明该部分的成员也是有序的,则可将待排序列的上界缩小到最后一次发生交换的成员处,这样可以缩小内层循环的扫描范围。
voidBubbleSort_3(intlib[],intn)//改进版2:
inthigh;
intlastSwapPos=n-1;
//初始化最后一次发生交换操作的位置为(n-1)
while(lastSwapPos>
0)
high=lastSwapPos;
//待排序部分数组的上边界即上一趟冒泡过程中,最后一次发生交换操作的位置
for(i=0;
i++)//内层循环扫描待排序部分数组,lib[0..high]为待排序部分
lib[i+1])
temp=lib[i];
lib[i]=lib[i+1];
lib[i+1]=temp;
lastSwapPos=i;
//记录发生了交换操作的位置
if(high==lastSwapPos)//若未进行交换操作,说明排序已经完成,提前结束扫描工作
break;
四,冒泡排序第三步优化
在第二步优化中,我们采用了将较大的元素往上顶的冒泡方法,通过记录发生交换操作的位置,将最后一次发生交换操作的位置作为待排序列的上边界,缩小了下一趟扫描的范围,提高了排序效率。
在实际编码时,我们还可以采用将较小的数往下沉的方法实现冒泡排序。
如果能够双向逼近,同时从两端缩小待排序列的范围,就可以最大限度的减少扫描次数。
voidBubbleSort_4(intlib[],intn)//改进版3:
双向冒泡
intlow,high;
//待排序部分数组的边界,即lib[low..high]为待排序部分,lib[0..low-1]和lib[high+1..n-1]为已排序部分
intlastSwapPos;
//最后一次发生交换操作的位置
low=0;
high=n-1;
while(low<
high)
lastSwapPos=high;
//设置需要排序的成员范围(大于此下标的成员已经排好序)
for(i=low;
i<
lastSwapPos;
count++;
high=i;
//该处发生了交换操作,更新需要排序的成员范围
if(lastSwapPos==high)//若未进行交换操作,说明排序已经完成,提前结束扫描工作
lastSwapPos=low;
//设置需要排序的成员范围(小于此下标的成员已经排好序)
for(i=high;
i>
i--)
count++;
if(lib[i]<
lib[i-1])
lib[i]=lib[i-1];
lib[i-1]=temp;
low=i;
if(lastSwapPos==low)//若未进行交换操作,说明排序已经完成,提前结束扫描工作
附录:
voidBubbleSort_5(intlib[],intn)//冒泡法基础程序:
将较小数向下移动
intlow;
//待排序部分数组的下边界,即lib[low..n-1]为待排序部分,lib[0..low-1]为已排序部分
for(low=1;
low<
n;
low++)//外层循环控制待排序部分数组的下边界,每完成一趟冒泡,下边界上移一个位置
for(i=n-1;
=low;
i--)//内层循环扫描待排序部分数组,比较相邻元素,并通过交换元素值的方式将最小值顶到最下方
lib[i]=lib[i-1];
voidBubbleSort_6(intlib[],intn)//改进版2:
将较小数向下移动
intlastSwapPos=0;
//初始化最后一次发生交换操作的位置为0
while(lastSwapPos<
n)
low=lastSwapPos;
//待排序部分数组的下边界即上一趟冒泡过程中,最后一次发生交换操作的位置
i>
low;
i--)//内层循环扫描待排序部分数组,lib[low..n-1]为待排序部分
if(low==lastSwapPos)//若未进行交换操作,说明排序已经完成,提前结束扫描工作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 冒泡 排序 及其 优化 方法