十大排序(第三节)

100 阅读3分钟
  1. 计数排序 8.1 算法思想 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序 a. 找出待排序的数组中最大和最小的元素; b. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; c. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加); d. 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1 时间复杂度:时间复杂度为线性的排序算法,为O(n+k),k是待排序列最大值 时间复杂度:时间复杂度为线性的排序算法,为O(n+k),k是待排序列最大值
  2. 桶排序 9.1 算法思想 假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序

9.2 算法流程 a. 人为设置一个BucketSize,作为每个桶所能放置多少个不同数值(例如当BucketSize==5时,该桶可以存放{1,2,3,4,5}这几种数字,但是容量不限,即可以存放100个3); b. 遍历输入数据,并且把数据一个一个放到对应的桶里去; c. 对每个不是空的桶进行排序,可以使用其它排序方法,也可以递归使用桶排序; d. 从不是空的桶里把排好序的数据拼接起来。 9.3 时间复杂度和空间复杂度 时间复杂度:桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。 空间复杂度:桶排序的空间复杂度为O(N+M);N为待排序元素个数,M为桶的个数

  1. 基数排序 10.1 算法思想 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。 10.2 算法流程 a. 取得数组中的最大数,并取得位数; b. arr为原始数组,从最低位开始取每个位组成radix数组; c. 对radix进行计数排序(利用计数排序适用于小范围数的特点)