八 大 排 序
- 直接插入排序:
类似扑克牌游戏,每次插入时,都为其寻找一个合适的位置,越有序越快,稳定
平均时间复杂度:o(n*n)
最好时间复杂度:o(n)
空间复杂度:o(1)
2.希尔排序
对大量的数据进行分组,减少时间复杂度。有一个增量序列,
最后一个必须是1。
跳跃式的排序,所以并不稳定
时间复杂度:o(n^1.3)~o(n^1.5)
空间复杂度:o(1)
第一次分组:
第二次分组:
第三次分组:
3.冒泡排序:
两两进行比较,每次将最大的沉底,稳定
时间复杂度:o(n*n)
空间复杂度:o(1)
4.快速排序
第一次选择数据最前面的作为基准,基准位置为low,最后一个位置为high,从high位置找比基准小的数据,找不到就high--,直到找到比基准小的数据,把该数据放在现在基准位置,从low位置开始找比基准大的数据,找不到就low++,找到就把该数据放在high位置,如此重复,直到low与high指向同一位置,该位置就是基准的位置,然后如果基准左右的数据个数大于1,则再分别对其左右进行上述步骤,直到没有数据再需要排序。不稳定,越有序越慢,最坏时间复杂度:o(n*n)(选择排序)
时间复杂度:o(n*log2n)
空间复杂度:o(log2n)
递归实现:
非递归实现:
5.选择排序
每次选择当前最小的数据放在当前的最前面,不稳定
时间复杂度:o(n*n)
空间复杂度:o(1)
6.堆排序
首先建立大根堆(父大于子)然后再将当前的根与当前的最后一个数字交换。再进行调整,使该树依然是大根堆。直到所有的数字比较完成。
建立大根堆的时间复杂度:o(n*log2N)
堆排序的时间复杂度:o(n*log2N)
空间复杂度O(1)
7.归并排序
一个数字默认有序
然后让其两两有序,再四四有序,再八八有序,直至所有数字都有序,稳定
时间复杂度:o(n*log2N)
空间复杂度:o(n)
8.基数排序(桶排序)
多关键字(出去的时候类似队列)
先排权重小的(个位),再排权重大的(百位)。依次类推,直至排完。
d趟数
r桶个数
n数字个数
时间复杂度:O(d*n)
空间复杂度O(n)