请您留下宝贵的建议吧:)
广西百色高中欢迎您!

| 网站首页 | 学校概况 | 软件下载 | 图片中心 | 雁过留声 | 视频资源 | 校长信箱 | 内 部 网 |
| 同 学 录 | 网络办公 | 教学课件 | 优秀教案 | 试卷下载 | 教学素材 | 教学论文 | 电子图书 |

 
您现在的位置: 广西百色高中校园网 >> 学校概况 >> 学生频道 >> 信息技术 >> 精典程序 >> 文章正文 用户登录 新用户注册
   
   

冒泡排序算法          【字体:
冒泡排序算法
作者:仔仔    文章来源:本站原创    点击数:    更新时间:2006-9-26

在解释冒泡排序算法之前,先来介绍把10个数(放在数组A中)中最大的那个数放在最后位置上的一种算法。算法描述如下:

1)从数组A[1]到A[10],把相临的两个数两两进行比较。即A[1]和A[2]比较,比较完后A[2]再与A[3]比较,……最后是A[9]和A[10]比较。

 (2)在每次进行比较的过程中,如果前一个数比后一个数大,则对调两个数,也就是说把较大的数调到后面,较小的调到前面。比如在第一次的比较中,如果A[1]比A[2]大则A[1]和A[2]的值就互换。下图用6个数据来说明以上的算法。

     假设6个数据是:A[]=5  7  4  3  8  6 

A[1] A[2] A[3] A[4] A[5] A[6]

5    7    4    3    8    6     第一次,A[1]=5和A[2]=7比较,7>5,不进行对调。

       5    7    4    3    8    6     第二次,A[2]=7和A[3]=4比较,4<7,进行对调,

                                       那么第二次比较完后的数据是5  4  7  3  8  6

       5    4    7    3    8    6     第三次,A[3]=7和A[4]=3比较,3<7,进行对调,

                                       那么第三次比较完后的数据是5  4  3  7  8  6

       5    4    3    7    8    6     第四次,A[4]=7和A[5]=8比较,8>7,不进行对调。

       5    4    3    7    8    6     第五次,A[6]=6和A[5]=8比较,6<8,进行对调,

                                       那么第五次也就是最后一次的结果是

5    4    3    7    6    8

由上例可以看出,对于6个数,排好一个数(最大的数)需要进行5次比较,可以推断出,对于N个数,一躺需要 N-1次比较操作,

上述算法已经把N个数中最大的数放到了A[N]中,再重复上述算法,把A[1]到A[N-1]中最大的数放到A[N-1]中,这样A[N-1]中存放的就是第二大的数,接着把A[1]到A[N-2]中最大的数放到A[N-2]中,……最后把A[1]到A[2]中大的那个数放到A[2]中,每重复一次两两比较后,比较的范围就朝前移动一个位置,此算法经过N-1次就完成了A[1]到A[N]中的的数由小到大的排列。

注意:如果要由大到小排列则在比较时前一个数比后一个数小就进行对调,方法相反。

由此可以看出,冒泡法的基本思想就是:在待排序的数据中,先找到最小(大)的数据将它放到最前面,再从第二个数据开始,找到第二小(大)的数据将它放到第二个位置,以此类推,直到只剩下最后一个数为止。这种排序方法在排序的过程中,是小的数就如气泡一样逐层上浮,而使大的数逐个下沉,于是就形象地取名为冒泡排序,又名起泡排序。

程序要求: 从键盘输入十个数,然后按从小到大的顺序输出。

    程序代码:

      program bubble(input,output);

      const n=10;

type

   colarr=array[1..n] of integer;

var

         a:colarr;  t,i,j:integer;

      begin

         writeln(‘INPUT 10 integer num:’);

         for I:=1 to n do read(a[I]);

         readln;

         for j:=1 to n-1 do

             for I:=1 to n-j do

               if a[I]>a[I+1] then

                 begin

                    t:=a[I];a[I]:=a[I+1];a[I+1]:=t

                 end;

         writeln(‘OUTPUT new num:’);

         for I:=1 to n do

             begin

                write(a[I]:4);

                if I mod 5=0 then writeln

             end;

         end.

      程序运行结果如下:

    input 10 integer num:  {提示输入10个数}

    7 6 23 21 19 18 10 16 5 13  {假如输入的数据}

    output new num:   {冒泡排序后输出结果}

    5   6   7   10  13

    16  18 19   21  23

 问题:假如要从从大到小输出程序应该怎么改?

两重循环总共执行了多少次?

文章录入:qinjun    责任编辑:qinjun 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
          最新热点       最新推荐       相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

       
     
     
     
    广西百色高中欢迎您!   网站地图 | 联系站长 | 友情链接 | 用户排行 | 版权申明 | 管理登录
    版权所有 Copyright© 2005-2010 广西百色高中 (桂ICP备05013955号)
    学校地址:广西百色市城乡路93号 电话号码:0776-2824142 传真:0776-2847293 邮政编码:533000
    站    长:覃钧  QQ:75331465            改版时间:2007年8月20日