一般情况下对于有n个元素的数组,一般冒泡排序需要n-1趟比较排序才能完成,但是在很多情况下,还没有达到n-1趟比较,数组元素已经全部有序,那么接下来的排序比较就毫无意义。下面的程序就是针对这种情况进行优化的。
在排序过程中,一旦发现数组已经排序完成,就不用再进行比较,意味着排序完成,直接结束排序。
#include<stdio.h>
#define LEN 8 //数组长度
int main()
{
int s[LEN], i, j, k;
int flag = 0; //优化标志位
for(i=0;i<LEN;i++)
scanf("%d",s[i]);
while(getchar()!='\n'); //按Enter键以开始下一趟排序
for(i=0;i<LEN;i++){
flag=0;
for(j=0;j<LEN-1-i;j++)
if(s[j]>s[j+1]){
flag=1;
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
if(!flag)
break; //如果这一趟排序走完之后没有发生任何的位置交换,那么排序就已经完成了
printf("第%d次冒泡后的顺序是:\n",i+1);
for(k=0;k<LEN;k++)
printf("%d",s[k]);
printf("\n");
getchar();
}
printf("排序完成.\n");
printf("冒泡排序完之后的顺序为:\n"); //打印出排序完成之后的数组
for(i=0;i<LEN;i++)
printf("%d",s[i]);
printf("\n");
return 0;
}