冒泡算法

来源:互联网 发布:js 设置焦点到input 编辑:程序博客网 时间:2024/04/29 19:37

        最终决定通过写技术类博客,愿以此修炼自己的内功而非简单地停留在拖控件的初级阶段,本人菜鸟,愿与所有有心的人一起探讨..........

         相信很多人用过sort函数,它对文件进行排序。包括按照字符进行排序,按照数字进行排序;升序排列,降序排列;稳定排序,不稳定排序;按照某一列进行排序,按照个别列进行排序;按照某一列的部分字符进行排序;及各种情况的组合排序。功能很强大.谁用谁知道,用过的人都说好.我自己当初也经常用.却从未意识到在.net框架下开发人员用到的是冒泡算法,不得不感慨自己的菜..........

      请允许一个菜鸟在这里谈一下对冒泡算法的一点看法:拿数组(比较常见,比较简单)来说所谓冒泡就是在数组中不断进行数值比较将大的指往后排,最后呈现一个升序的数组排列.其中的几个关键是
1.交换: 当出现前一个值比后一个要大时两个数就要进行交换,大的值下沉
2.循环比较的标志:当一躺比较下来之后没有发现有数据交换,那么我们是不是可以得出数据已经按升序排列了呢?

算法如下:

定义一个布尔值用来决定是否还需要进行比较排序 bool loop =true
当loop为true时
{
  使loop为false
  执行完整的遍历,如果有交换     //未完全排序,继续循环
  将遍历条件loop设置为true
}

伪代码:

定义一个布尔值 bool loop =true
当loop为true时
{
  使loop为false
  for(int j=0;j<list.length-1;j++)
   {
      if( list[j] > list[j+1] )
       {
        交换这两个数
        将loop设置为true
      }  
  }
}

 

这里有个问题是,当一次循环结束后.下次循环时我们是不是还有必要将上次循环得到的最大值(已经排在最后一为)再进行比较呢?答案是显而易见的.网上见过很多只是简单的 j < list.length-1 如果数目比较小影响不是很大,一但涉及到很大数量级的排序时,其缺点暴露无疑.
怎样对已经排序的区域不再进行比较呢?我们可以简单地在外部循环添加一个遍历计数器 i 可以通过 i 逐渐减少内部循环for的循环次数,只要  j<list.length-(i+1) 即可.

修改的伪代码如下:

定义一个布尔值 bool loop =true
for(int i=0; loop;  i++)
{
  使loop为false;
   for( int j=0; j<list.length-(i+1) ; j++)
   {
      if( list[j] > list[j+1] )
       {
        交换这两个数
        将loop设置为true
      }  
  }
}

-----------------------------------------------------------------  完整程序C#版(略)  -----------------------------------------------------------