欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

对排序算法的一些思考和总结

时间:2023-06-09

一味的好高骛远是不行的,在学习了一些框架之后,我又重新返回了基础知识的学习,今天想讲的就是数据结构中的排序算法。接下来我将以排序的类型进行总结(概括性)。

插入排序类 直接插入排序

将记录插入到一个已经排好序的有序列表中,从而得到一个新的、记录+1的有序列表。

通过赋值方式来取代交换,最优情况(序列本身有序)下时间复杂度能达到O(n),减少了性能上的损耗,属于稳定排序。

希尔排序

作为直接插入排序的升级,采用跳跃分割策略,以“增量”为间隔的子序列内使用直接插入排序。直到最后的增量值为一。

相应的,由于跳跃式记录,该排序方法并不稳定。

选择排序类 简单选择排序

该算法相当于使用一个暂存变量来保存待排序队列中的最小值,尽可能的把交换次数减小。但是不论好坏情况,他的比较次数都是一样多的。。。

推排序

通过完全二叉树的性质,将待排序数组看成一个二叉树(也可以是顶堆),规定根节点一定是最大或者是最小的值。通过构造堆,每一次将堆顶和末尾元组互换并且“弹出”,随后重新在剩余的序列中构造堆。

在算法中分为构造堆和交换首尾元素再构造两部分,在堆构造的时候,通过二叉树性质,我们可以在遍历的时候使用*2代替+1.在时间上快了很多。最优和最坏的情况下都达到了O(nlogn),缺点可能就是复杂的堆结构以及不稳定

归并类排序 归并排序

我理解成等空间换时间的排序算法,最优和最坏的情况下同样都达到了O(nlogn),使用了递归,并且在排序时是两两比较的,不存在跳跃,所以也是稳定的算法。

交换类排序 快速排序

通过一趟排序将序列分为两部分——一部分的数值都小于枢值,另一部分都大于枢值。

算法通过两端交替比较对换来得到枢值,接着对两部分递归进行排序。

但是该算法仍然存在很大的优化空间。

首先就是优化枢值选取,因为快排实际上也是跳跃进行的,那么我们可以形象地把它的递归过程想象成一个二叉树,尽量将枢纽值作为中间节点,所以我们选取的枢纽值就不能太大或者太小,我们可以使用三数取中的方法确保枢纽值尽可能的合理。

然后就是将交换变成赋值操作,每一次比较之后的交换变成赋值。

最后就是减少递归的次数,可采用尾递归方式,每一个只递归小数部分。

                        平均时间、最优、最坏、空间、稳定

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。