优化冒泡排序算法

问题分析:冒泡排序算法的基本思想就是相邻数据比较若逆序则交换,经过n-1趟比较交换后,逐渐将小数据冒到数组的前部,大的数据则陈到数组的后部,从而完成排序工作。

现在假设本来的数据本来就是从小到大有序的,则原有算法仍要做n-1趟比较操作,事实上,一趟比较下来,若发现没有进行过交换,若发现没有进行过交换,就已经说明数据全部有序,无须进行其后的比较操作了。

当然年数据原本有序的概率,但经过少于n-1趟比较交换操作后,数据就已经有序的概率却非常高。因此,为提高效率可以对冒泡排序算法进行改进,当发现某趟没有交换后就停止下一趟的比较操作。

人类可以用眼睛“宏观”地发现一组数据是否有序的状态,但算法值能通过逐一比较才能明确数据是否处于有序状态,,这用逻辑表达式是不可能实现的,这时就考虑用标志量来记录每趟交换数据的的情况,如flag=0表示没有进行过交换,一旦有数据进行交换则置flag为1,表示已进行过交换,当一趟比较交换完成后,若flag仍为0时,则无须进行下一趟操作,否则若flag为1时,只能继续进行下一趟操作。

#include<stdio.h>
int main()
{
 int i,j,t,n,a[100],flag;
 while(scanf("%d",&n)!=EOF)
 {
  for(i=0;i<n;i++)
   scanf("%d",&a[i]);
  flag=1;
  for(i=1;i<n&&flag==1;i++)
  {
   flag=0;
   for(j=n-1;j>=i;j--)
   {
    if(a[j]<a[j-1])
    {
     t=a[j];
     a[j]=a[j-1];
     a[j-1]=t;
     flag=1;
    }
   }
  }
  for(i=0;i<n;i++)
  {
   printf("%d",a[i]);
   if(i<n-1)
    printf(" ");
   else
    printf("\n");
  }
 }
 return 0;
}

分类:

技术点:

相关文章: