左神算法笔记(三)——桶排序及排序总结

排序稳定性

排序稳定性在于对于相同的数值,能否将相同数据原本的顺序保证不交换。
1(0)2(1)2(2)1(3)——>排序:1(0)1(3)2(1)2(2)

针对于原始的信息排序,之前的顺序可能本身存在着一定的意义,排序稳定性会使得重新排序之后依旧维持着之前排序的特点。

工程中的综合排序

1.程序判断数组是否为基础类型,若为int,short,char,double,float基础类型,则会采用快速排序。因为基础类型数据本身无差异,无需考虑排序稳定性
2.排序的内容为stu等自己定义的类型,内部存在不同字段,则会采用归并排序进行排列。自己定义的数据类型之间可能本身存在联系,因此需要考虑排序稳定性。
3.如果数组长度很短(长度小于60),则不管以上哪种类型直接采用插排。

排序问题补充

1.归并排序的额外空间复杂度可以变成O(1),具体可以搜索“归并排序,内部缓存法”
2.快速排序可以做到稳定性问题,但是很难,不需要掌握,可以搜“01stable sort”
荷兰国旗问题无法保证稳定性,因为数据本身是将小于区和大于或等于的数据进行数据交换,交换的过程无法满足稳定性。
3.有一道题目,是奇数放在数组左边,偶数放在数组右边,还要求原始的相对次序不变,碰到这个问题,可以怼面试官。面试官非良人。

比较器

比较器主体是代码,在此不再编写

桶排序

桶排序不基于比较,不基于比较的排序的一大类是桶排序,桶排序是一种思想概念,会单独开一个博客重点记录。
瓶颈:数据状况本身存在限制,桶排序这类不基于比较的排序不想之前的那样受重视。

给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。

1.如果有N个数,则准备N+1个桶。首先针对所有数据进行遍历。
2.如果最大和最小值相等,则差值为0.
3.如果最大最小不为0,则将最小值放到0号桶中,最大值放到N号桶中。最大值和最小值中间差值等分为N+1份,数值属于哪个范围则划分到哪个桶中。
4.由于共有N个值,但是共有N+1个桶,所以必定会使得中间至少存在一个空桶。所以最大差值一定不会来自于相邻的桶,只有空桶左右一定会存在相邻的桶,左边非空桶中搜集的最大值和右边非空桶的最小值的差值则是相邻两数的最大差值的备选。
5.最后计算的时候需要计算每个桶中的最大最小值,计算相邻桶中数据的差值,中间存在空桶数据差值不一定最大,因此需要全部计算桶内最大最小值。
代码在maxGap中

你可能感兴趣的:(左神算法专栏)