1 冒泡排序:
过程 两个数比较大小,如果第二个数小,交换位置
优化
针对数据排好序后,冒泡排序还是会进行下一轮的比较
设置一个标志flag,如果发生了交换设置为1,没有就为0
当一轮比较结束后,flag依然为0,说明已经排好序,则不需要下面的排序了
时间复杂度: O(n2), 最好情况O(n)
空间复杂度:O(1)
稳定性:稳定
2选择排序
过程:
在长度为n的数组中,第一次遍历n-1,找到最小的和第一个交换
第二次遍历n-2,找到最小的和第二个交换。。。
时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:不稳定
3插入排序
类似抓扑克牌
从一个数开始,该数可以看做已经排好序,
取出下一个,从这个数从后向前扫描,如果比前一个小,交换位置,直到放在他合适的位置
重复
可以使用二分查找来找到合适位置
数组如果比较有序,会很快
时间复杂度:O(n2) 最好情况O(n)
空间复杂度:O(1)
稳定性:稳定
4快速排序
选一个基准点,从后面找到第一个比他小的,从前面找到第一个比他大的,交换位置,直到
i==j,最后将i位置和low位置交换值,然后递归
优化:
1 选择随机基准数,避免基准数太大或太小
2 再分出一路来保存和基准数相同的树
时间复杂度:O(nlogn) 最坏情况O(n2)
空间复杂度:O(logn)
稳定性:不稳定
5归并排序
时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定性:稳定