冒泡排序

冒泡排序是较常用的排序方法。是一类具有”交换“性质的排序方法。

冒泡排序的基本思想:

(以按从小到大排序为例)
(1)将序列中的第1个元素与第2个元素进行比较,若前者大于后者,交换,否则,不交换。
(2)再将第2个元素与第3个元素比较,若前者大于后者,则交换,否则,不交换。
(3)以此类推,直到第n-1个元素与第n个元素进行比较为止。
以上过程为第1趟冒泡排序。经过第一趟冒泡排序后,序列中最大的元素置于了序列的尾部。
(4)然后对剩下的n-1个元素做同样的操作,这叫做第二趟冒泡排序,
(5)如此下去,当执行完第n-1趟的冒泡排序后,冒泡排序就完成了。

实则不难想象,这种排序方法就是通过序列中相邻之间的交换,使较小的元素逐步从序列后端移到序列前端,使较大的元素从序列前端向后移。


冒泡算法与对其的改进

冒泡排序算法描述:

void bubblesort(keytype k[],int n)
    {
       int i,j,tmp;
       for(i=1;i<=n-1;i++)
       {

          for(j=1;j<=n-i;j++)
          {
              if(k[i]>k[i+1])
            {
               tmp=k[i];
               k[i]=k[i+1];
               k[i+1]=tmp;
            }
         }
       }
    }

上述算法是对数据从小到大排序,k[0]不存放内容

但是,上述的算法并不是一个优秀的冒泡排序算法。如果在完成所有趟之前就已排好序,那么有些趟就只是比较而没有交换,即做的就是无用功。
在算法中可以设置一个标志变量flag。规定flag=1时说明本趟中仍有元素交换的动作,flag=0,无交换。

改进后的冒泡算法如下:

void bubblesort(keytype k[], int n)
    {
        int i,j,tmp;
        for(i=1;i<=n-1&&flag==1;i++)
       { 
             flag=0;
             for(j=1;j<=n-i;j++)
          {
             if(k[i]>k[i+1])
               {
                  tmp=k[i];
                  k[i]=k[i+1];
                  k[i+1]=tmp;
                  flag=1;
               }
           }
       }
    } 

改进后的算法可以减少排序趟数,提高效率。


例:编写一个c程序,应用冒泡排序法对序列{2,5,6,3,7,8,0,9,12,1}进行排序,要求从大到小排序,并输出排序后结果。

#include"stdio.h"
void bubblesort(int k[],int n)
{
   int i,j,tmp;
   for(i=1;i<=n-1&&flag==1;i++)
    { 
        flag=0;
        for(j=1;j<n-i;j++)
        {
             if(k[i]<k[i+1])
             {
                  tmp=k[i];
                  k[i]=k[i+1];
                  k[i+1]=tmp;
                  flag=1;
             }
        }
    }
}

main()
{
    int i,a[11]={-111,2,5,6,3,7,8,0,9,12,1};
    printf("The orginal data array is\n");
    for(i=1;i<=10;i++)
       printf("%d",a[i]);
   bubblesort(a,10);
   printf("\nThe result of bubble sorting for the array is\n");
   for(i=1;i<=10;i++)
       printf("%d",a[i]);
  getche();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值