九大排序算法-备战春招

桶排序(Bucket Sort)(箱排序)

基本思想:设置若干个箱子,依次扫描待排序的记录 array[0],array[1],…,array[n - 1],把关键字等于 k 的记录全都装入到第 k 个箱子里(分配),然后按序号依次将各非空的箱子里的记录收集起来,从而完成排序.桶排序所需要的额外空间取决于关键字的个数,若 array[0…n - 1] 中关键字的取值范围是 0 到 m - 1 的整数,则必须设置 m 个箱子。因此箱排序要求关键字的类型是有限类型,否则可能要无限个箱子。一般情况下每个箱子中存放多少个关键字相同的记录是无法预料的,故箱子的类型应设计成链表为宜。
时间复杂度
桶排序的平均时间复杂度是线性的,即 O(n)。但最坏情况仍有可能是 O(n ^ 2)。
空间复杂度
桶排序只适用于关键字取值范围较小的情况,否则所需箱子的数目 m 太多导致浪费存储空间和计算时间。
是否稳定
稳定

基数排序(Radix Sort)

基本思想:基数排序是对桶排序的改进和推广。如果说桶排序是一维的基于桶的排序,那么基数排序就是多维的基于桶的排序。我这么说,可能还不是太清楚。比方说:用桶排序对 [0, 30] 之间的数进行排序,那么需要 31 个桶,分配一次,收集一次,完成排序;那么基数排序则只需要 0 - 9 总共 10 个桶(即关键字为数字 0 - 9),依次进行个位和十位的分配和收集从而完成排序。基数排序不需要进行记录关键字间的比较,是一种借助于多关键字排序的思想对单逻辑关键字进行排序的方法。
时间复杂度
基数排序的时间复杂度为 O(n)。
空间复杂度
基数排序所需的辅助存储空间为 O(n + r * d),其中 r 为记录中关键字分量的最大个数,d 为关键字的个数。比如说:待排序为 0 - 999,那么分量的最大个数为 3,关键字的个数为 10(0 - 9)。
是否稳定
稳定

快速排序(quick sort)

基本思想:
1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的
时间复杂度
基数排序的时间复杂度为 O(nlogn)。
空间复杂度
O(logn)
是否稳定
不稳定

冒泡排序(BubbleSort)

基本思想:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
时间复杂度
基数排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
空间复杂度
O(1)
是否稳定
稳定

归并排序(merge sort)

基本思想:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
时间复杂度
基数排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度
O(n)
是否稳定
稳定

插入排序(Insertion sort)

基本思想:
⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;
⒊重复第二步,共进行n-i次插入处理,数列全部有序。
时间复杂度
基数排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
空间复杂度
O(1)
是否稳定
稳定

选择排序(Selection sort)

基本思想:
1.从头到尾扫描序列,找出最小的数与第一个数交换,那么第一次交换后最小的数在第一个位置上。
2.接着对第i个位置上的数,在后续数组中,选最小的与i对换。
3.重复第二步,共进行n-1次交换,数列全部有序。
时间复杂度
基数排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
空间复杂度
O(1)
是否稳定
不稳定

堆排序(heap sort)

基本思想:
1.首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端
2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1
3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组
时间复杂度
基数排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度
O(1)
是否稳定
不稳定

希尔排序(shell sort)

基本思想:
先将待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成),分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
时间复杂度
基数排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度
O(1)
是否稳定
不稳定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值