V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lhx2008
V2EX  ›  问与答

冒泡排序和插入排序 是不是实际上区别不大?

  •  
  •   lhx2008 · 2017-11-24 11:30:50 +08:00 · 4265 次点击
    这是一个创建于 2556 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我能想到的两个区别:
    1. 插入排序是从靠近 已排序区 的一端开始排,冒泡排序是从远离 已排序区 的一端开始排
    2. 待排序的元素 到达指定的位置后,插入排序 不再继续检查,冒泡排序 仍然继续检查到尾端

    如果:
    冒泡排序如果手动指定一个 flag 变量,使到达位置后不再检查,
    那么,是不是可以说两个排序除了第一个微小的区别以外,基本没有区别?
    7 条回复    2017-11-24 15:10:02 +08:00
    neosfung
        1
    neosfung  
       2017-11-24 11:47:44 +08:00
    是的
    冒泡其实就是插入排序的一种变种,实现方式不一样而已
    coderluan
        2
    coderluan  
       2017-11-24 12:01:56 +08:00
    冒泡排序和插入排序的算法复杂度是一样的,所以在我眼中,他们根本没区别......
    czheo
        3
    czheo  
       2017-11-24 12:22:40 +08:00
    差别挺大的啊。
    最大区别:冒泡时在 [未排序的部分] 里面找最大(或小),放到一端。插入是往 [已排序好] 的部分里面插入当前数。
    不变条件(invarient)不同:冒泡是,最大的数会先被排序好到一端。插入是,当前点的一侧是已排序的( sorted ),这些数并不一定是最大的。
    循环终止条件不同:冒泡必须遍历未排序的所有数字才能找到最大,插入找到合适位置就可以停。
    czheo
        4
    czheo  
       2017-11-24 12:32:19 +08:00
    czheo
        5
    czheo  
       2017-11-24 12:44:49 +08:00
    liuminghao233
        6
    liuminghao233  
       2017-11-24 12:56:23 +08:00 via iPhone
    升级版希尔排序可能会好一些
    blackjar
        7
    blackjar  
       2017-11-24 15:10:02 +08:00
    冒泡跟选择差别不大才对吧 插入就是另外一种思路了
    冒泡跟选择都会把待排序列中最大或者最小值每次排出 插入则不是
    另外冒泡在每个单元操作中都要交换一次 而选择通常只是对 flag 的位置赋值一次(所以冒泡通常会更慢)
    当然这三种都是 O(n2)的排序 这个是一样的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2148 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:18 · PVG 09:18 · LAX 17:18 · JFK 20:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.