算法--八大排序

排序重要性

在计算机编程的过程中,需要学习很多的算法,了解算法的设计与原理可以帮助我们提高自身的编程素养。学习算法最基本最常见的就是排序算法了。排序也为算法的学习与入门提供了一个很好的例子。
排序的目的就是为了方便查找,但是为了提高计算机的运行时间和内存占用,前人们提出并不断改进各种各样的排序算法,这些算法也从不同角度展示了算法设计的重要原则和技巧。

排序算法根据不同的划分依据有不同的划分标准:

根据算法稳定性可以分为稳定(冒泡排序、插入排序、归并排序、基数排序)和不稳定(选择排序、快速排序、希尔排序、堆排序)。
排序算法的稳定性通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。

也可以划分内部排序和外部排序两类,如下图所示:

排序算法分类

废话不多说,接下来依次讲一下八大排序算法:

选择排序--简单(直接)选择排序

时间复杂度:O(n^2)
空间复杂度:O(1)
稳定度:非稳定
1.从第一个位置8依次往后比较大小,第一次遍历的过程中找到最小元素0,然后将0与8交换位置;
2.从第二个位置5依次往后比较大小,第二次遍历的过程中找到最小元素1,然后将1与5交换位置;
3.....
重复直到最后一次遍历完成,排序过程也就完成了。


简单选择排序动画展示

选择排序--堆排序

时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定度:非稳定
堆排序是利用利用树这种数据结构所设计的一种排序算法。堆可分为两种:大顶堆和小顶堆。
大顶堆要求每个节点的值不大于其父节点(小顶堆要求每个节点的值不小于其父节点)。堆排序正是利用这个特性,不断地将堆顶元素取出进行排序。这个用语言比较难讲清楚,大家还是看下边的动画理解吧:


堆排序

插入排序--直接插入排序

时间复杂度:O(n^2)
空间复杂度:O(1)
稳定度:稳定
1.从n个元素的首元素开始,先比较前两个元素的大小,将较小值置于左端;
2.再将第三个元素在前两个已经排序好的元素之间找到其位置;
3.再将第四个元素在前三个已经排序好的元素之间找到其位置;
4.再将第五个元素在前四个已经排序好的元素之间找到其位置;
....
直到最后一个元素在前n-1个已经排序好的元素之间找到其位置,排序完成。
动画如下图所示:


直接插入排序

插入排序--希尔排序

时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定度:非稳定
希尔排序首先将n个元素以n/2为步长划分元素为一组,对每个小组内的元素进行直接插入排序,然后每个小组均为有序数组,再将n个元素以n/4为步长划分....依次循环。具体步骤如下图所示:
我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 .....1} n为要排序数的个数

希尔排序

交换排序--冒泡排序

平均时间复杂度:O(n^2)
空间复杂度:O(1)
稳定度:稳定
冒泡排序可以这样理解:将一个长度为2的滑动窗从元素的最左向右依次滑动,每次保证窗口内部的元素最大值在窗口的右边,如果最大值不在右边的话,则交换窗口内部的两个元素位置。滑动窗口第一次滑动完成后,将元素的最大值置于最右端。依次循环完成排序。


冒泡排序

交换排序--快速排序

平均时间复杂度:O(nlogn)
空间复杂度:O(logn)~O(n)
稳定度:非稳定
快速排序实质是对冒泡排序的改进。快速排序的过程可以与双指针结合理解:在所有的记录中取某一个记录的值为标准(通常取第一个记录键值为基准),通过一趟排序将所有的元素分为两个部分:标准元素的左边均为小于或等于当前标准的元素,标准元素的右边均为大于当前标准的元素。如下图所示为第一个标准元素6从开始到完成一次快速排序的过程(在首尾共建立两个指针指向当前的元素,其中一个指针指向标准元素6的位置,对于左指针来说,如果指针指向的元素大于标准值,则交换两个元素的位置,右指针相反):


快速排序

归并排序

平均时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定度:稳定
归并排序其实就是将n个元素先划分为n个长度为1的组,然后进行两两归并,第一次归并结束的结果是有n/2个排序好的组。再依次进行两两组的归并,如此重复,直至最后形成包含n个记录的有序文件位置。


归并排序

基数排序

平均时间复杂度:O(d(r+n))
r代表关键字基数(一组数组中有几个不同的数字),d代表序列中最大值的位数,n代表序列的长度
空间复杂度:O(dr+n)
稳定度:稳定
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。大家直接看图理解:

基数排序

综上言简意赅的介绍了每种排序方法以及其排序的过程。希望可以帮助各位看官加深理解与学习。

注:本文的一些动图来自于其他网站,也诚挚的感谢他们。
https://blog.csdn.net/donglynn/article/details/49758003
https://www.cnblogs.com/zhi-ming/p/10453124.html

你可能感兴趣的:(算法--八大排序)