关于排序算法的随手记

  • 递归实现排序算法还是栈实现排序算法都存在空间复杂度问题。

  • 另外就是插入排序对于原本已经有序的数组排序效率接近n,对于乱序的排序则反而接近n^2.希尔排序(步长排序)就是先通过步长将原数组分为很多小组先调整出顺序性,然后再最后进行插入排序。其利用的就是插入排序对有序数组效率高的性质来设计的。

  • 归并排序也被叫做二叉树排序,因为他是完全二叉树自底向上的排序过程。(有点像线段树)

  • 快速排序,希尔排序,归并排序3兄弟常常和堆排序做比较,因为堆排适合处理大数据排序。而快排,希尔排,归并排,都是处理小空间排序。
    这几种排序都不稳定,但是都是高效排序。

  • 快排的不稳定在于它找一个中位数的过程是随机,所以为了使快排能找个好的中位数,常常采用头尾和中间3个数求平均值的方法,大概率能求得中位数的值。因此,快排也相对希尔排和归并排受大众喜欢。

  • 希尔排最节省内存,迭代即可。

  • 归并排和快排需要栈空间。

  • 快排的核心疼点就是:中位数不好找,所以很多人为了逼近中位数,玩出了很多花里花俏的手法。

比如:随机取3个元素的平均值(或者4个数,5个数也可以的…原理就是,赌平均值和中位数的方差不大。)

还有另一种玩法,就是用多叉树递归来代替二叉树递归,如果多叉树和二叉树都能找到一个稳定的中位数的话,那么他们的时间复杂度是一样的。

但是大部分情况下,多叉树递归估计效果比较好,因为容易找到中位数。就好像让我们闭着眼睛切蛋糕,切一刀和切两刀,很明显切两刀更容易劈中蛋糕。哈哈哈哈哈

而所谓的双轴快排就是等价于3叉树递归,利用的原理就是“劈两刀更容易劈中蛋糕”。

这里有一个问题,如果递归的深度变浅了,子节点变多了,性能会有什么变化?

  • 堆排序稳定性比快排高,但是堆排有缺点,就是数据变换大,不利于CPU缓存,只能说快排对硬件友好罢了。

  • java的排序算法就有用到双轴快排,准确的说java会对数组特点选择多种排序算法:单轴快排(256小数组会用),归并,双轴快拍,双变量插入排序(如果数组结构化比较好的话会用),都用到了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章