一.稳定性
稳定性: 比如 2 3 2 4 4
排序后 2 2 3 4 4
就是排序之后我们如何才能保证两个2前后的关系,在原始序列中是不变的,这个就是稳定性
如果不会打乱,就是具有稳定性 反之就是不稳定的
冒泡排序:
时间复杂度:n平方
不稳定,但是可以做到稳定性 ,例如下面的列子
让相同的值,第二继续往下沉就可以了,这样就实现冒泡法排序的稳定性
插入排序:
时间复杂度:n平方
不稳定 ,但是可以做到稳定性 如下图
实现思路:往前插入,遇到相同的值,就停
选择排序:
时间复杂度:n平方
不稳定 也做不到稳定 ,分析如下图
归并排序:
时间复杂度:nlogn
不稳定 但是可以做到稳定性
快速排序:
时间复杂度:nlogn
不稳定 不能做到稳定性
因为partition的过程 无法做到稳定性
堆排序:
时间复杂度:nlogn
不稳定:无法做到稳定性
完全二叉树
稳定性的意义:
就是原始的信息,没有被打乱
工程中的综合排序算法:
如果是基础类型 比如 int double char float shot 等,用快速排序 基础类型不用区分 顺序 比如 3 3 3
如果是自己定义的 比如 people 等里面有多个属性 就用归并排序 身高排序 后成绩排序 所以有差别
如果数据量较小,则用插入排序,不用前两种 因为插入排序 常数项很低 数据量小于60直接用插入排序
面试常问:
为什么在综合排序中,会选择,复杂度很高的进行,排序 ?
因为常数项低
为什么基础类型用快排 自定义类型 用归并 ?
从稳定性的角度考虑的
有关排序问题的补充:
第三道题:奇数放左边,偶数放右边 还要求原始次序不变 时间复杂度为o(n) 空间复杂度为o(1)
不能做到 .......