对一组数据进行排序:首选的是快速排序算法,但是在实际的项目中,很多时候我们根据应用场景应该有很多选择,例如:
根据这组数据有什么特征:
例如 :如果有大量重重复元素,用三路排序效果更好(java中的排序接口就是三路快速排序)
例如: 如果是否大部分的数据距离他正确的位置是否很近?是否近几乎有序(或有序):我们利用插入排序更好一些(应用场景:银行业务按照发生的时间进行排序)
例如:数据的取值范围是否有限?比如对学生成绩排序(北京高考成绩分数0-750),我们采用基数排序效果更好
对排序有什么额外要求:
例如是否需要稳定排序(通俗地讲就是能保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。):如果需要稳定排序,快速排序不适合,归并排序是更好的选择
归并排序 分组 两两合并
三路快排 分成三部分, <Key = Key >Key
基数排序
每个元素的位数要相同
001 221 109 078
1、随意分配,按照最低位(第三位)分配到不同的桶中
2、收集,编号为0的开始收集,从下向上收集
3、第二次分配,按照第二位分配
4、再次收集 相同的规则(输出特点,按照第二位排序的同时,第二位相同的前提下,最萨比无额位也是有序排列的)
5、第三次分配,按照第一位分配
6、收集,输出结果达到排列结果
希尔排序
1、分组 每隔几个人为一组(谁都行,一般选择总长度的一般)
2、组内排序(相对位置不变(0 4 8 )排序后 仍在只在这三个位置上
3、再次找到分组间隔,这次的间隔减半
4、直到间隔为1为止
5、组内排序选择使用插入排序
问题:为什么不直接用插入排序 效率高得多
插入排序
从第一个元素开始,依次将元素插入到数组中,每次增加一个,直到全部放入位置
选择排序
每一次选择一个最小的,放到第一位
新的数组抛出第一位,重复操作
堆排序Heap排序
堆的概念
大顶堆:根节点是堆中所有节点中的最大值,成为大顶堆,>=左,>=右
堆排序
先存入二叉树,遍历使得,根节点大于孩子节点值
取完对顶元素后,将最小值放入堆顶
1、构造一个大顶堆,取堆顶数组
2、再将剩下的数字构成一个大顶堆,取堆顶数字(剩下元素中的最大值)
3、重复以上操作,直到取完堆中的数字,最终得到一个从大到小排列的数字
桶排序
放最大值数个桶,每个桶记录每个数字出现的次数