数据结构_排序算法(详细演示,看完就会)

一:排序一览

排序方法 类别 本文 时间复杂度 是否稳定
直接插入排序 插入排序 跳转 O ( n 2 ) O\left ( n^{2}\right ) O(n2)
希尔排序 插入排序 跳转 O ( n 2 3 ) O\left ( n^\tfrac{2}{3}\right ) O(n32)
直接选择排序 选择排序 跳转 O ( n 2 ) O\left ( n^{2}\right ) O(n2)
堆排序 选择排序 跳转 O ( n l g n ) O({nlgn}) O(nlgn)
是否为子树 简单 跳转 LeetCode 递归
对称二叉树 简单 跳转 LeetCode 递归
平衡二叉树 简单 跳转 LeetCode 递归
重建二叉树 中等 跳转 牛客 递归

二:简单插入排序

(1)基本思想

简单来说:简单插入排序将整个序列分为有序和无序两组,开始时默认第一个数字就是有序序列,接着挑选无序序列中的第一个数字,与有序序列数字(从后向前)挨个比较,如果小于继续比较前一个,直到某一时刻大于有序序列中的某个数字时,将将其插入在后面,然后扫描下一个无序序列中的数字。
在这里插入图片描述

(2)代码

排序数组为:int a[] = { 9,1,2,5,7,4 };

单趟排序
为了便于讲述具体排序过程,下面给出一趟排序的具体流程,代码如下
在这里插入图片描述
根据以上代码可以给出如下流程

在这里插入图片描述
完整排序
经过以上分析,要进行完整排序,只需从第二个元素开始,挨个向前插入到有序序列当中去。

所以简单插入排序可以总结为:把一个序列分成有序和无序两个部分,有序序列位于[0,end],无序序列[end,n-1],不断把[end,n-1]中的元素插入[0,end]区间内。
在这里插入图片描述

(3)动态演示

在这里插入图片描述

(4)分析

简单插入排序在序列基本有序时,效率很高,时间复杂度也很低,但是当一个序列高度无序时,就会显得很吃力,尤其是像基本无序的序列,使用简单插入排序就很伤。
所以简单插入排序适用于数据元素较少,且基本有序的情况。当然它的一些后序会用希尔排序将其优化


三:希尔排序

(1)基本思想

希尔排序又叫做增小缩量排序。是对简单插入排序的一种优化,其基本思想是:选定一个整数gap,以gap为组距,将原序列分成若干组,对每个组进行简单插入排序,完成之后,gap再缩小,重复以上步骤。带待到gap=1时,整个序列已经基本有序了,其最后一次进行的排序就是简单插入排序,但是这一次的排序相比直接用简单插入排序,其时间复杂度大大降低了。
在这里插入图片描述

(2)代码

1:单趟排序,分组论述
还是假设gap=3,对这几组进行排序的过程如下
在这里插入图片描述

代码如下(展示蓝色那一组的排序)
在这里插入图片描述
可以发现经过这一趟排序后,序列又接近有序了。

所以gap越大,越大的数据越容易跑到后面,越小的数据越容易跑到前面。gap越大,越不接近有序,gap越小,越接近有序。当gap=1时就是简单插入排序

2:单趟排序
上述代码有一个问题就是,它只能完成蓝色那一组排序,对于绿色和紫色则不行,因为由有gap的控制。所以说按照正常的相反,就是有多少组就搞出多少组for循环进行控制。但是如果这样做,希尔排序可能就没有存在的意义了。所以希尔排序它的巧妙之处就在于:多趟并排
代码如下
在这里插入图片描述
具体过程如下

在这里插入图片描述
3:完整排序
最后一步,理应就是控制趟数。前面说过gap过大过小都不好。研究表明gap控制在3左右效果最好。为了使最后一次gap=1,使gap=gap/3+1,这样无论gap设为多少,总是在最后一次能进行增量1的简单插入排序。
在这里插入图片描述

(3)动态演示

图片转载自:十大经典排序算法(动图演示)

在这里插入图片描述

(4)分析

希尔排序是对插入排序的优化,如果一个序列完全逆序,那么这种优化十分明显,比如生成一个十万个元素的数据,完全逆序,采用直接插入排序所用的时间为
在这里插入图片描述
而采用希尔排序,这一时间竟然会压缩到
在这里插入图片描述


四:直接选择排序

(1)基本思想

和简单插入排序有所区别。直接选择排序默认认为整个序列是无序的,每次从这个无序序列中选出一个最小(或最大)的元素放到这个无序序列的首位。放在首位的元素,就被划分为了有序序列,然后无序序列的个数自然少一个了,然后重复上述过程
在这里插入图片描述

(2)代码

1:单趟排序

单趟排序的过程如下
在这里插入图片描述
2:完整排序
所以从上面可以看出,每趟排序结束后,无序序列就缩小了,等价于上图中的begin不断增大,所以完整代码如下
在这里插入图片描述

(3)动态演示

在这里插入图片描述

(4)分析

直接选择分析很好理解,但是效率低,所以一般不会使用


五:堆排序

关于堆和堆排序相关内容,请移步

数据结构-堆与堆排序


猜你喜欢

转载自blog.csdn.net/qq_39183034/article/details/113772137