十大排序算法

1、冒泡排序
n-1趟每趟两两比较最大的放右边
O(n2) 最佳情况:O(n)(上一次不交换就结束)

2、选择排序
左边为有序区,每趟选最小索引放有序区右边,n-1趟
O(n2)

3、插入排序
一个个插到左边有序区,插入要挪
O(n2) 最佳情况:O(n)不用挪

4、希尔排序
间距gap为一组,gap不停/2到1,每个gap为一趟进行插排
O(nlogn):用了分治,复杂度很难证明

5、归并排序
每个数组分两半一直分直到数组长度小于2后两两按序合并(二路归并)相当于二叉树每层都要O(n)(merge)
证明:T(n)=2T(n/2)+n/2(最优)递归到2*k=n
O(nlogn)
merge用了O(n)空间

6、快速排序
partion算法:选个支点,双指针使支点左边不大于右边,O(n)
对左右两边继续用
二叉树
O(nlogn) 最坏是O(n2):n-1次递归
空间是递归深度

7、堆排序
建堆:用调整算法从最后一个非叶往前,O(n)
取最大
调整堆:一直往下子大的换父,递归,O(n*logn)
https://blog.csdn.net/qq_34228570/article/details/80024306
O(nlogn)

8、计数排序
先找max和min,用数组bucket存个数,下标是arr减min,只要个数不为0的填回去下标加min
为了表示数的正确位置,统计存到当前位置有多少个数,再倒序遍历赋值稳定
O(n+k),k为不同数/桶的个数,复杂度应该是取n和k最大值
空间是O(k)

9、桶排序
跟计数排序不同是多个桶,array/桶个数来分配保证左桶里的数不大于右桶,每桶各自快排合并即可
遍历O(n)
每个桶内的时间复杂度为(n/k) log(n/k)。有k个桶,那么时间复杂度为k(n/k)log(n/k)=n (log n-log k)
两块相加,再加个O(k)因为取n和k最大值
O(n+nlog(n/k)+k),n==m最好O(n)
空间O(n+k),也是要n和k最大值

10、基数排序
先按各位收集到不同的桶,分别用计数排序,再按十位百位
O(d(n+k)),d是几位数,常数,k是基数/桶数
空间O(n+k)

后三种属于非比较排序
选择:简单选择与堆排
插入:简单插入与希尔
交换:冒泡与快排

稳定性:
选择:不稳定因为交换的时候可能会出现
堆排:不稳定因为可能子节点交换导致跟别的父节点顺序调换
插入:稳定因为懒得再挪多一次
希尔:不稳定因为分组了交换可能调换顺序
冒泡:稳定因为懒得再交换多一次
快排:不稳定因为交换双指针会出现
归并:稳定取决于merge
计数:稳定因为倒序插入
桶排:稳定因为可以用计数
基数:稳定因为可以用计数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值