三大计算机排序算法-冒泡,选择,插入比较


1比较维度


前面我们分别讲了三种排序算法:冒泡排序,选择排序,插入排序,那么大家肯定会有个问题,我该选择哪种算法?

三大计算机排序算法-冒泡,选择,插入比较

评价一个算法的优劣,可以从四方面入手:

  • 排序算法的执行效率,要考虑最好情况,最差情况和平均情况。

  • 排序算法的内存消耗。

  • 排序算法的稳定性。

  • 哪种算法代码更简单。




2算法比较


第一项:通过之前的文章我们已经知道,在基本有序数据进行排序时,冒泡排序和插入排序都是与n成正比,选择排序与n2成正比。

完全逆序的时候,三种算法都是与n2成正比,所以要比较一下细节:冒泡比较次数是n(n-1)/2,交换次数是3*n(n-1)/2,总次数是2n(n-1),选择排序比较次数是n(n-1)/2, 交换次数是2(n-1)次,总次数是n(n+3)/2-2, 插入排序总次数是n(n+1)-2。 最差的情况下从执行效率上来说插入排序 略优于 选择排序 略优于 冒泡排序

在平均情况下,排序记录是随机的,那么根据概率相同的原则:冒泡排序比较次数不会变,交换次数每次降到最差情况的1/2。选择排序比较次数占大头,并且不会变。所以最差,最好和平均情况相差不大。插入排序比较次数每次会降到最差情况的1/2, 移动次数每次也几乎会降为最差情况的1/2。所以

平均情况下三种排序依然是与n2成正比,经过计算依然是:插入排序 略优于 选择排序 略优于 冒泡排序(计算过程略)。


第二项:三种算法除了待排序数据本身都几乎没有借助其他内存空间,也就是原地排序,所以这一项三种算法一致。

第三项:所谓的算法稳定性,就是当列表中有两个一样的数字时候,经过排序之后这两个数字顺序是否会变化?假设有如下的考试成绩数据,大家如果足够细心的话会发现是按照姓名字母排序的。
李市民 90

刘帮 70

张三疯 70

赵狂饮 75

朱院长 60
现在我们想按照分数排序,排完序后的数据需要姓名还是按原来字母顺序排列的。也就是这样的顺序(刘帮和张三疯的顺序没有变),如果是这样的顺序就是稳定的:
李市民 90

赵狂饮 75

刘帮 70

张三疯 70

朱院长 60
我们会发现用冒泡排序和插入排序都不会导致顺序产生变化,而只有选择排序会导致顺序问题。如果是全国高考进行一个成绩排名,1000多万的数据,如果姓名顺序产生变化,将非常不好找。而算法是否能导致相同数据的位置产生变化就叫算法的稳定性

第四项:哪种代码更简单,似乎差不太多,个人感觉选择排序更容易理解,其次是冒泡排序,然后是插入排序。大家也可以在留言里说出自己的看法。
所以三种排序算法的比较如下(O()是算法中的大O表示法,大家直接理解成时间消耗与n成正比,还是与n2成正比就可以)

三大计算机排序算法-冒泡,选择,插入比较


3结论


经过比较,基本可以得到结论,在三者之中,插入排序略显优秀一些,如果代码能够轻松理解,正常情况下就用插入排序。既然插入排序更优秀,为什么还要学习其他两种排序方法?举个例子,会打篮球的人,都知道蓝球技巧包括:左右换手,背后运球,胯下运球... 也许有一种技巧过人的概率更大,但是不同情况下还是要选择不同的技巧,技不压人,那么排序技巧也是一样的。


三大计算机排序算法-冒泡,选择,插入比较


同时我感觉学习这些排序并不是为了用各种方法把数字排好,如果真的是这样,学习一种排序就可以了。通过这些天对这些排序方法的梳理,我发现对数字的感觉提升了。这就像一个蓝球新手面对对手拦截的时候感到毫无头绪去突破,而对一个人球一体的高手来说,想怎么突破就怎么突破。就像掌握蓝球是从培养球感开始,而与数字打交道就是从培养数感开始,学习这些排序方法就是对批量数字感觉的一种培养途径。



分享到:


相關文章: