【算法】计数排序 + 各个排序算法的稳定性

本文详细介绍了计数排序的算法思路,包括计数和拷贝到原数组的步骤,并探讨了计数排序的空间复杂度和适用场景。此外,还讨论了不同排序算法的稳定性,如直接插入排序、选择排序、堆排序、冒泡排序、快速排序和归并排序,指出计数排序是稳定的排序算法。
摘要由CSDN通过智能技术生成

之前介绍的排序算法:


计数排序

计数排序是一个非基于比较的排序算法,该算法于1954年由Harold H. Seward提出

它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法

当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序)

在这里插入图片描述

  • 时间复杂度:O(Max(N, Range))
  • 空间复杂度:O(range)
  • 适合范围比较集中的整数数组
  • 范围较大,或者是浮点数等等都不适合排序了

一、算法思路图解

1. 计数

基本思路:遍历数组a,a[i]下标对应的count[a[i]]++

在这里插入图片描述

  • count数组大小

    看样子范围应该是0到a数组中最大的数?

    实则不是,如果数字是

    1000, 1001, 1100

    则从0到1100 ,浪费了很多空间

    所以我们定义一个映射数组,所有的数字都是相对最小的数字的大小

    1000, 1001, 1100

    映射数组数字大小:a[i] - min

    0, 1, 100

    将它设置为count数组对应下标


2. 拷贝到原数组

这里主要是寻找数组下标与数组值之间的对应关系

  • count[i],拷贝的数字是i + min进入原数组ÿ

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凛音Rinne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值