冒泡排序的改进: 初始状态第1轮第2轮第3轮第4轮第5轮 7 2 2 2 a|2]1 3 245 712459 579 24579 579 579 a5 从这道例题中我们发现,在进行完第二轮比较后,实际上 排序已经完成了,从第三轮开始,后面的比较都是多余的, 在这种情况下我们希望可以终止比较
11 9 7 1 2 4 5 a[0] a[1] a[2] a[3] a[4] a[5] 7 1 2 4 5 9 1 2 4 5 7 9 1 2 4 5 7 9 1 2 4 5 7 9 第1轮 第2轮 第3轮 第4轮 第5轮 1 2 4 5 7 9 从这道例题中我们发现,在进行完第二轮比较后,实际上 排序已经完成了,从第三轮开始,后面的比较都是多余的, 在这种情况下我们希望可以终止比较. 初始状态 冒泡排序的改进:
#include <stdio. h> 为了解决问题,我们在程序中 void main( 设置一个变量flag,用它记录 i int a 6,i,j, t, flag: 在一轮比较中是否进行了交换 for(i=0;i<6;i++) scanf(%od”,&al[il); 在每轮比较开始前fag=0,如 i=0 果在此轮比较中进行了交换, do 则flag=1,在一轮比较结束后, flag=0; 判断fag的值是否为1,如果值 for(j=0;j<5-i;j++) 为0,说明在此轮比较中没有进 if(ali>alj+ID) 行交换(即已经完成排序了) t=alj;a=aj+1;此时可以终止循环(即结束排 a[j+1=t; flag=l; 序)如果fag的值为1,则要继 续进行排序 i++; while( flag); for(i=0;i<6;i++) printf((“%3d”,al); 12
12 为了解决问题,我们在程序中 设置一个变量flag ,用它记录 在一轮比较中是否进行了交换. 在每轮比较开始前flag=0,如 果在此轮比较中进行了交换, 则flag=1,在一轮比较结束后, 判断flag的值是否为1,如果值 为0,说明在此轮比较中没有进 行交换(即已经完成排序了), 此时可以终止循环(即结束排 序)如果flag的值为1,则要继 续进行排序 #include <stdio.h> void main( ) { int a[6] , i , j , t , flag; for ( i=0; i<6; i++) scanf(“%d”, &a[i] ); i=0 ; do { flag=0; for ( j=0 ; j<5-i ; j++) if ( a[j]>a[j+1] ) { t=a[j] ; a[j]=a[j+1] ; a[j+1]=t ; flag=1; } i++ ; } while ( flag ) ; for ( i=0 ; i<6 ; i++) printf( “%3d”,a[i] ); }