冒泡和快速排序的时间复杂度_算法·八种经典排序

993fd7ef4c631f980f954a0c31f8f923.png

——采用“插入”思想

1.直接插入排序

【思路】:将队列分为有序区和无序区两部分,每次都从无序区选第一个插入到前面的有序区中的正确位置。插入前需要移动元素。

【性能】:直接插入排序是稳定排序,时间复杂度为O(n^2),不需要额外空间。

2.希尔排序

【思路】:本质是分组插入排序。先将整个待排序的序列用增量分割成为若干子序列分别进行直接插入排序,逐步减少增量,直至增量为1时即对全体记录进行直接插入排序。

0e01f3034defc787ec09f1a0bfa575f7.png

【性能】:希尔排序是不稳定排序,性能难以分析。

【操作】:初始增量一般取n/2,逐步减半。

——采用“选择”思想

3.直接选择排序

【思路】:将队列分为有序区和无序区两部分。选出最小(或者最大)的一个数与第1个位置的数交换,然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推。

【性能】:直接选择排序是不稳定排序,时间复杂度为O(n^2),不需要额外空间。

4.堆排序

【思路】:利用堆来快速选出最大或最小的数。建立初始堆后,每次交换堆顶和最后一个元素,输出该堆顶,然后重新调整堆。重复该过程。

8f791f1f4de954862112ac6c34097de7.png

【性能】:堆排序是不稳定排序,时间复杂度为O(nlogn)。

【补充】:二叉堆是一棵完全二叉树,堆中任意节点的值总是不大于(不小于)其子节点的值,一般用数组实现。

——采用“交换”思想

5.冒泡排序

【思路】:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。使关键字最大的记录如气泡一般逐渐往上“漂浮”直至“水面”。

08f5b9e07de6fff52dfb4f66c484bf4d.gif

【性能】:冒泡排序是稳定排序,时间复杂度为O(n^2),不需要额外空间。

【操作】:一般设置一个标记,若没有发生数据交换则提前结束冒泡排序。

6.快速排序

【思路】:每轮选择一个基准元素(比如第一个),将待排序的记录分割成两部分,一部分的元素值均比基准元素值小,另一部分比基准值大,然后分别对这两部分用同样的方法排序。一般基于递归实现。冒泡排序每次只调整了一个数或几个数的相对关系,而快速排序每遍都让两边保持相对关系。

6a993ce6361b6b30c55d28d824041015.png

【性能】:快速排序是不稳定排序,时间复杂度为O(nlogn)。快速排序是通常被认为在O(nlog2n)的排序方法中平均性能最好的,但最坏情况下快速排序退化为O(n^2)。

——采用其他思想

7.归并排序

【思路】:先将序列逐级分为子序列,然后再一层层向上归并。是分治法的典型应用。

d6803193c770b36854fe21a8b8dd6266.png

【性能】:归并排序是稳定排序,时间复杂度为O(nlogn)。需要O(n)的额外空间。

【实现】:每次可以先合并到一个局部的暂存序列,待合并完成后再复制回原数组。

8.基数排序

【思路】:基数排序是通过“分配”和“收集”过程来实现排序,而不是通过数据比较。如先按个位分类,然后按十位、百位以此类推。

5309326d58cfd0f9c74d5244d65f9b92.gif

【性能】:假设在基数排序中,r为基数,d为位数。则基数排序的时间复杂度为O(d(n+r))。对于任何位数上的基数进行“装桶”操作时,都需要n+rd个临时空间。是稳定排序算法。

总结

32072ebcdb17efb1c17c5c20587a98fa.png

(排序算法的稳定性是指:具有相同关键字的记录,若排序后这些记录的相对次序保持不变,则称这种排序算法是稳定的,否则称为不稳定的。)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值