谈谈这些排序

本文深入探讨了各种排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、堆排序和归并排序。文章详细阐述了每种排序算法的基本思想、时间复杂度和空间复杂度,并指出快速排序在最好、平均和最坏情况下的时间复杂度。对于数据结构的学习者来说,这是理解排序算法的重要参考资料。
摘要由CSDN通过智能技术生成

数据结构很重要,排序是其大头菜,今天我就来谈一下排序吧,参考文献有www.nowcoder.com/discuss/200097,《数据结构C++语言描述》以及《大话数据结构》,废话不多说。注意,在排序问题中通常将数据元素称为记录,另外注意一下什么是排序的稳定性。

0、内排序与外排序

 

根据排序过程中借助的主要操作, 我们把内排序分为:插入排序、交换排序、选择排序和归并排序

1、交换排序

这是最简单的排序实现,其基本思想是让每一个关键字都和它后面的每一个关键词一次比较,如果是反序则交换。

这种排序方法,每一轮排序过后对剩余的关键字排序没什么帮助。因此效率非常低。

2、冒泡排序 

冒泡排序也是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果是反序则交换,直到没有反序的记录为止。

 图中经过一轮循环后,不仅仅把最小的冒泡到首位,还把次小的冒泡到前面。接下来分析一下复杂度。


冒泡排序不管序列是怎样,都是要比较n(n-1)/2 次的,最好、最坏、平均时间复杂度都为O(n²),需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1)。有很多人说冒泡排序的最优的时间复杂度为O(n),其实这是在代码中使用一个标志位来判断是否已经排序好的,是冒泡排序的优化版,如果元素已经排序好,那么循环一次就直接退出。

3、简单选择排序

冒泡排序的思想就是不断地交换,这和做股票短线频繁操作的人是类似的。选择排序的基本思想是每一趟在n-i+1个记录数据中选取关键字最小的记录作为有序序列的第i个记录,比起交换排序,只是少了交换的操作。

选择排序是冒泡排序的改进,同样选择排序无论序列是怎样的都是要比较n(n-1)/2次的,最好、最坏、平均时间复杂度也都为O(n²),需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1)。

4、直接插入排序

其基本思想像极了理牌的时候

其基本操作是将一个记录插入到已经排好序的有序表中。基本思想是判断每一个记录,如果你比前面一个大,OK,不管你了,操作下一个元素;如果你比前面一个小,我得把你插入到合适的位置了。具体做法是将大于该值的所有元素都后移一位。该元素插入到合适位置。


如果序列是完全有序的,插入排序只要比较n次,无需移动时间复杂度为O(n),如果序列是逆序的,插入排序要比较O(n²)和移动O(n²) ,所以平均复杂度为O(n²),最好为O(n),最坏为O(n²),排序过程中只要一个辅助空间,所以空间复杂度O(1)。 

5、希尔排序 

希尔排序法,原理类似于插入排序法,但可以减少数据移动的次数,排序的原则是将数据划分成特定间隔的几个子集,以插入排序法完成子集内的数据后再渐渐减少间隔的距离
* 在任何情况下时间复杂度均为O(n的3/2次方)
* 非稳定排序
* 只需一个额外空间,空间复杂度最佳
* 适用于数据大部分都已经排序完成的情况

6、堆排序

堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次小值。循环即可。
主要在初始化堆过程和每次选取最大数后重新建堆的过程,初始化建堆时的时间复杂度为O(n),更改堆元素后重建堆的时间复杂度为O(nlogn),所以堆排序的平均、最好、最坏时间复杂度都为O(nlogn),堆排序是就地排序,空间复杂度为常数O(1)。

7、归并排序

归并一词的含义就是合并,并入的意思,在数据结构中的定义就是将两个或两个以上的有序表组合成一个新的有序表。归并排序的原理就是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并。循环得到一个长度为n的有序序列为止。称为2路归并排序。
需要一个临时temp[]来储存归并的结果,空间复杂度为O(n),时间复杂度为O(nlogn),可以将空间复杂度由 O(n) 降低至 O(1),然而相对的时间复杂度则由 O(nlogn) 升至 O(n²)。稳定,内排序一般不用,用于外排序。

8、快速排序 

快速排序的思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到这个序列有序的目的。快速排序时间复杂度最好是O(nlogn),平均也是O(nlogn),最坏情况是序列本来就是有序的,此时时间复杂度为O(n²),不稳定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值