首页 > 编程知识 正文

各种排序方法的比较,三种常用的排序方法

时间:2023-05-05 10:16:07 阅读:284510 作者:1383

本文章部分图片和定义参考网络上他人博客,如有侵权立即删除。 几种排序算法以及性能比较

稳定性:指排序时相同大小元素的相对位置是否发生变化,不发生变化则说明该排序稳定。

一、直接插入排序(内部排序、O(n^2)、稳定):小规模数据或者数据基本有序时高效

  插入排序详细介绍:https://blog.csdn.net/sindyra/article/details/103597338

       原理:从待排序的数中选出一个来,插入到前面的合适位置。

       基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

       直接插入排序稳定的原因:

由于插入排序是从前往后取出元素,依次与这个元素的前面所有的已排序的元素比较,所以如果后面出现有与前面元素相等的元素,直接插入到这个相等的元素后面,没有改变相等元素的前后顺序,因此稳定。

二、冒泡排序(稳定、基本有序可达O(n),最坏情况为O(n^2))

        冒泡排序详细介绍: https://blog.csdn.net/sindyra/article/details/103597708

        冒泡排序:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

        冒泡排序稳定的原因:

        冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。
        所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,
        这时候也不会交换,所以相同元素的前后顺序并没有改 变,所以冒泡排序是一种稳定排序算法。

 

三、归并排序(O(nlogn)、稳定)

  归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
  首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可

四、选择排序(O(n^2)、不稳定)
  每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾位置),直到全部待排序的数据元素排完。

       选择排序详细介绍:https://blog.csdn.net/sindyra/article/details/103597926

 

       选择排序不稳定的原因:

       选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,
       依次类推,直到第n-1个元素,第n个 元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,
       如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么 交换后稳定性就被破坏了。
       比较拗口,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被         破坏了,所以选择排序不是一个稳定的排序算法。

五、快速排序(O(nlogn)、不稳定)

       选择排序详细介绍:https://blog.csdn.net/sindyra/article/details/103598022

  快速排序简称快排,是一种比较快的排序,适合基本无序的数据,为什么这么说呢?下面我说下快排的思路:

  设置两个指针:i和j,分别指向第一个和最后一个,i像后移动,j向前移动,选第一个数为标准(一般这样做,当然快排的关键就是这个“标准”的选取),从后面开始,找到第一个比标准小的数,然后再从前面,找到第一个比标准大的数,互换这两个数的位置,第一趟的结果就是标准左边的都小于标准,右边的都大于标准(但不一定有序),分成两拨后,继续递归的使用上述方法,最终有序!

        快速排序不稳定的原因:

       快速排序有两个方向,左边的i下标一直往右走,直到a[i] > 参考值(p)或者走到数组结尾,参考值一般取为数组第0个元素。
       而右边的j下标一直往左走,当a[j] < 参考值(p)。如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。
       交换a[j]和参考值,完成一趟快速排序。在参考值和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,
       比如序列为 5 3 3 4 3 8 9 10 11, 现在参考值5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,
       所以快速排序是一个不稳定的排序算法,不稳定发生在参考值和a[j] 交换的时刻。

几种排序方法适用场景:
冒泡排序(稳定):基本有序,且数据量较小时。
插入排序(稳定):基本有序,且数据量较小时。
选择排序(不稳定):跟数据是否有序无关,数据量较小时适用。
归并排序(稳定):当数据量较大时适用,最少,最坏与平均时间一致,但需要较多辅助空间。
快速排序(不稳定):当数据量较大,数据是随机分布时适用,需要一点辅助空间。快速排序的平均时间最短,但可能                                      出现最坏时间。

堆排序(不稳定):当数据量较大时适用,最少,最坏与平均时间一致,无需辅助空间。
希尔排序(不稳定):
当数据量中等时适用,数据越有序,越高效,希尔是对插入排序的一种优化。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。