七大比较排序总结

本文详细介绍了比较排序的多种算法,包括插入排序、冒泡排序、选择排序、归并排序,以及它们的时间复杂度、稳定性、是否需要辅助空间等特性。此外,还提及了希尔排序和快速排序作为不稳定排序的例子,以及稳定排序如归并排序。文章讨论了排序算法的稳定性在多键排序中的重要性,并提供了每种排序算法的基本思想和代码示例。
摘要由CSDN通过智能技术生成

排序分为比较排序和非比较排序,这里先介绍比较排序
插入排序:直接插入排序,希尔排序
交换排序:冒泡排序,快速排序
选择排序:直接选择排序, 堆排序
最后是归并排序。
基于比较的排序都是遵循“决策树模型”,而在决策树模型中,我们能证明给予比较的排序算法最坏情况下的运行时间为Ω(nlgn),证明的思路是因为将n个序列构成的决策树的叶子节点个数至少有n!,因此高度至少为nlgn。(算法导论)

非比较排序:基数排序,计数排序,桶排序
线性时间排序虽然能够理想情况下能在线性时间排序,但是每个排序都需要对输入数组做一些假设,比如计数排序需要输入数组数字范围为[0,k]等。

这里写图片描述
图片来源于网络

文章将从以下几个角度来阐述这些算法:(面试常考点)
1. 每个算法的基本思想
2. 每个算法的稳定性
3. 每个算法的时间复杂度,最好、最坏以及平均
4. 参考代码
5. 是否需要辅助空间

写在文章开始的话:

  • 是否需要额外空间的分类:当排序数据非常多的时候,额外空间会非常大,老式电脑会吃不消
    In-place sort(不占用额外内存或占用常数的内存):插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序。
    Out-place sort:归并排序、计数排序、基数排序、桶排序(后三种属于分比较排序)

  • 是否稳定 的分类:是否稳定的一种简单的判别方式:是都有跨越距离的交换(该距离内的数据没有进行比较),如果有,一般都为不稳定算法;若否,则一般为稳定算法
    stable sort:插入排序、冒泡排序、归并排序、计数排序、基数排序、桶排序。
    unstable sort:选择排序(5 8 5 2 9)、快速排序、堆排序。
    是否稳定有一点要注意:需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。
    例如大于小于等于号的问题,该是大于不要写大于等于,否则很可能改变稳定性。 冒泡排序中的比较,>写成>=,两个数相等也会交换位置,这样就改变了稳定性!!

  • 为什吗要考虑稳定性
    排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位排序后元素的顺序在高位也相同时是不会改变的
    这里写图片描述


下面开始具体介绍

1. 直接插入排序
思想:插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
插入排序的工作方式像玩扑克牌时顺序放牌一样。开始时,左手为空并且桌子上的牌面向下。然后,每次从桌上拿一张牌并将它插入左手中正确的位置。为了找到正确的位置,我们从右到左将它与已在手中的每张牌比较,原来的牌是排好序的,如果比刚拿出的牌大,则将其再向右移一个位置,直到找到一个比刚拿出来的牌更小的,此时将这张牌放到该位置。
这里写图片描述
这里写图片描述

稳定性:在插入排序中,K1是已排序部分中的元素,当K2和K1比较时,直接插到K1的后面(没有必要插到K1的前面,这样做还需要移动!!),因此,插入排序是稳定的。
时间复杂度
最好的情况下:正序有序(从小到大),这样只需要比较n次,不需要移动。因此时间复杂度为O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值