1.6冒泡——一点新的感悟

其实我是没打算写这个算法的,你也看出来了,不是吗。
不过我今天看到了一个实现,觉得很有意思,不妨讨论一下。
冒泡排序的核心就是:假设需要非降序排列,然后相邻元素比较,若左大于右,就交换。写出来就是:

void bsort(int a[], int n)
{
  for (int j = n-1; j >= 0; --j)
    for (int i = 1; i <= j; ++i)
    {
      if (a[i-1] > a[i])
        swap(a[i-1], a[i]);
    }
}  

之所以叫冒泡排序,就是因为每执行一次排序,就把一个最大的元素浮出去。
不过我今天看了一个实现,就很有意思。我写一下:

void bsort(int a[], int n)
{
  for (bool sorted = false; sorted = !sorted; --n)
    for (int i = 1; i < n; ++i)
    {
      if (a[i-1] > a[i])
      {
        swap(a[i-1], a[i]);
        sorted = false;
      }
    }
}

这段代码就很有意思,尽管道理上没有什么改变,不过它却削弱了冒泡的含义,相反,它的想法是,消除每一个逆序对,我之前的文章也写过什么是逆序对,就不说了。而代码停下的依据也是整个序列中不存在逆序对,这是标志着排序的sorted就是true了。
而外层for循环的判断结构上也很巧妙,我们知道继续循环的条件是满足条件,就是“条件为真”,所以当序列中有逆序对的时候,sorted == false,而进入循环后,因为sorted = !sorted,sorted就被设为了true,只有排列中不存在逆序时,sorted才会保留true,进而在外层判断时被赋值为false,不满足条件,结束循环。
本文没有什么特殊含义,就是看到了一个不错的实现,想分享一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,915评论 18 139
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,375评论 0 1
  • 带着老人孩子出远门是对自己的考验吗?昨天工作到很晚,今天收拾行囊出门,我只有五天的时间安排行程。明天的五台山是必去...
    吴槿瑄阅读 192评论 0 0
  • 1. 母亲是个唠叨的人,唠叨的程度我给200分。只要我在家,基本上都是我做饭,但是因为种种原因,都是妈妈买菜回来,...
    王廾廾阅读 1,943评论 11 27
  • 这都是需要一生学习的东西,要循序渐进,不要着急。
    dodododi阅读 219评论 0 0