排序算法的稳定性及汇总
稳定性举例:
一个数组:arr = [1,2,3,2,3,1,2,2];
拍完序 arr = [1,1,2,2,2,2,3,3] 不仅保证顺序正确,还要保证索引顺序也正确;
作用:
对基础类型没什么用,对非基础类型(我们实际生活中的一些)排序有很重要的作用。
比如:你先按价格低到高稳定排序,再按好评由好到差排序,那结果就是物美价廉的商品,排在最前面了。
不具备稳定性的排序:
1选择排序(n2):
如【3,,3,,3,1,,3,,3,,3】
从左到右找到一个最小的跟第一个值“交换”,1和3交换以后,索引为0的3跑到了索引为1,,2的后面了,所以不
具备稳定性。
2快速排序():
3堆排序:
具备稳定性的排序:
1冒泡排序(n2):(相等时不交换可以稳定,交换就会不稳定)
2 插入排序(n2)(相等时不交换可以稳定,否则不稳定)
右边的和左边的依次比较,比左边的小,就交换,插在左边,相等不交换就稳定
3归并排序(nlog(n)):
merge的时候先拷贝左边的在拷贝右边的就能稳定
4计数排序(放桶,先入通的先出)
5基数排序(放桶,先入通的先出)
总结:
快排 指的是 随机快排,也叫 快排3.0
tips:1,一般来讲,排序的话会选择 “快排”,因为1,快排的指标(时间复杂度)是N*logN的,其次,经过实验的结果,快排的常数项是最低的,最快的,所以能用快排就用快排。
2,如果实在有空间的显示,很容易空间就超了,那就用 “堆排”。
3,如果需要使用有稳定性的排序,用归并排序
结论:根据不同需求使用不同排序,目前来说不能达到完美的排序,时间复杂度,空间复杂度也低,还稳定,要有取舍的
O(N*logN)利用其调度的优势, O(N^2)利用小样本情况下常数时间低的优势
系统自己实现的排序:如果发现你的数组是基础类型的,就用快排,否则用归并,请问为什么? 是因为 稳定性。
先序遍历:(非递归)