首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C语言经典算法之冒泡法改进

C语言经典算法之冒泡法改进

/*   冒泡法是数据排序的一种基本算法,它的基本方法是:相邻两元素进行比较,如有需要则进行交换,
每完成一次循环就将最小元素排在最后(如从大到小排序),下一次循环是将其他的数进行类似操作?
如将N 个数按从大到小排序,Turbo C语言程序函数
如下: */
void sort(int a[],int n);
main()
{
   int a[100],i ,j ,n ;
   /*输入数组元素的个数及各元素的值*/
   scanf(%d,&n);
   for(i =0;i <n ;i ++ )scanf(%d,&a);
   sort(a,n);
   for(i =0;i <n ;i ++ )printf(%d,a);
}

sort(inta[],int n)
    {
      int i ,j ,t ;
      for(i =n -2;i >=0; i--)
          for(j =0;j <i ; j++)
               if(a[j]<a[j +1])
               {
                   t =a[j];
                  a[j]=a[j +1];
                   a[j +1]=t ;
               }
    }
/*N 个元素需比较N *(N -1)/2,效率较差?其实,可根据每一次循环比较中的情
况改进之?   [改进一]:若某次循环中没有数据交换过,则可认为数据已经有序了,
不必再进行循环了,可在程序中设一变量Flag 用来标识有无数据交换? */
sort(int a[],int n)
{
         inti ,j ,t ,flag ;
         for(i =n -2;i >0; i--)
         {
                   flag=0;
                   for(j=0;j <i ; j++)
                            if(a[j]<a[j+1])
                            {
                                     t=a[j];
                                     a[j]=a[j+1];
                                     a[j+1]=t ;
                                     flag=1;
                            }
                   if(flag ==0)break;
         }
}
/*[改进二]:如果在一次循环中,最后的某些元素没有交换过,则说明后面这些元
素的顺序已排序,下次循环可不对其进行比较?本方法主要考虑要排序的数组元素的范
,而不是每一轮排序都将数组元素的范围减少1?*/
sort(int a[],int n)
{
         inti ,j ,t ,k,flag ;
         flag=n -1;
         while(flag >0)
         {
                   k=0;
                   for(j=0;j <i ;j ++)
                   if(a[j]<a[j+1])
                   {
                            t=a[j];
                            a[j]=a[j+1];
                            a[j+1]=t ;
                            k=j;
                   }
                   flag=k; /*此处不填flag = flag -1;*/
         }
}
返回列表