排序算法总结

排序算法总的来说可以分为2类,分别是基于比较的排序:选择排序、冒泡排序、插入排序、希尔排序、归并排序、快速排序、堆排序(可以归属于数据结构排序,本质上还是基于比较);不基于比较的排序:计数排序、基数排序。
排序算法的稳定性指排序之后不改变相同字段的相对顺序,如下图。不稳定的排序算法:快速排序、希尔排序、选择排序、堆排序。
在这里插入图片描述

1、 选择排序

从头开始每次从待排序区域选择最小元素放在已经排好序的末尾。时间复杂度O(N²),无论数据是什么样的,算法复杂度都是不可优化的。
在这里插入图片描述

2、 冒泡排序

以升序排列为例,依次比较相邻的两个元素,若前者比后者大则交换,这样每一轮下来可以将待排序区域中最大元素放到其对应的位置上。时间复杂度O(N²),它是可以优化到O(N),具体做法是当待排数据本身有序时,判断第一轮是否交换元素,若没有则停止进行。
在这里插入图片描述

3、 插入排序

插入排列可以类似扑克中摸牌往手中插到合适的位置,即从右边无序区域选择数字通过比较大小放到合适的位置。时间复杂度O(N²),它是可以优化到O(N),当数据本身有序时每次取牌之后直接插入到有序区域之后即可。需要注意的是从无序区域往有序插使用二分并不能达到nlogn,因为即使是使用二分,插入时,后面所有元素移位都会造成n的复杂度。该排序算法适合小数据。
在这里插入图片描述

4、 希尔排序

插入排序在数据量较小、数据基本有序情况上效率高。希尔排序正是利用这样的特点,希尔排序前期分组数大参与排序数据量较小、后期数据基本有序。该排序是对插入排序的升级,采用分组排序,每轮比较每组第一个数据,每组分组数依次减少至1。该算法复杂度不好计算,很大程度上取决于分组数的变化方式。
本例采用二分递减变化方式。
在这里插入图片描述

5、 计数排序

计数排序是鸽巢排序的升级版。首先介绍一下鸽巢排序,首先使用计数数组统计待排序数据中每个数据出现的次数,然后从头遍历计数数组将出现非0次数的数据到结果中。
在这里插入图片描述

计数排序在鸽巢排序的基础上加入的前缀和,即每一位表示小于等于该数字的数量,根据该数量将数据插入到指定的位置,接着将该数量减一。
在这里插入图片描述
在这里插入图片描述

6、 基数排序

基数排序是依次比较每个数字的某一位(个、十、百…),准备十个桶(分别表示该位数字上为0-9),比较某一位时将每个数字该位与桶一致的数据放到对应的桶里面,为了避免比较某一位时不改变上一位的排序结果,使用先进先出的数据结构队列。
在这里插入图片描述

7、 堆排序

堆排序是利用最大堆和最小堆两种数据结构本身的特性来进行排序。堆是完全二叉树(最后一层节点如果有必须先有左节点才能有右节点,其他层节点个数是满的)。堆的底层可以用数组实现。以最大堆实现升序排列为例,最大堆的特点是父亲节点比左右子节点的值都要大。首先建立最大堆,接着将最大堆的头节点取出放到堆的最后,同时堆的大小减一、调整堆的结构。当所有头节点取出后就形成从小到大的顺序。调整堆是一个递归过程,当往堆里面插入元素时,首先将新的元素放到堆的最后,接着从最后一个非叶子节点开始往前依次判断每个节点是否满足堆的特性,若不满足则交换父节点和其中一个子节点,接着递归调整这个子节点;当取走堆的头节点时,将最后一个节点放到头节点的位置,再从头节点开始依次递归调整堆的结构如插入操作一样。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、 归并排序

归并排序是将待排序数组不断对半递归,当递归到元素个数为1时再将两段相邻的有序数组进行合并直到全部元素都合并到一起。归并排序的额外空间复杂度可以变成O(1),但实现很难(实现可用归并内部缓存法),还会丧失稳定性,不如直接用堆排序。
在这里插入图片描述

9、 快速排序

快速排序和归并排序可以看成是相反的过程。先设立一个哨兵作为参考对象,将所有比其小的数放在左边,比其大的数放在右边,再递归地处理左边和右边两部分即可。全部操作完数组就是有序的。它的时间复杂度会根据选的哨兵情况而决定,最坏会到O(N²)。排序算法一般都是用快排,因为快排的常数项指标最低,也就最快。快排可以做到稳定性,但会使快排的空间复杂度变成O(N),不如直接用归并排序。

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值