📜  DAA-基数排序

📅  最后修改于: 2021-01-12 03:40:39             🧑  作者: Mango


基数排序是许多人在按字母顺序排列大量名称时直观地使用的一种小方法。具体地,首先根据每个名称的首字母对名称列表进行排序,即,将名称排列为26个类别。

凭直觉,人们可能想对数字的最高有效位进行排序。但是,基数排序通过首先对最低有效数字进行排序而违反直觉。在第一遍中,所有数字都按最低有效位排序,并组合成一个数组。然后在第二遍,将所有数字再次在第二个最低有效数字上排序,并组合成一个数组,依此类推。

Algorithm: Radix-Sort (list, n) 
shift = 1 
for loop = 1 to keysize do 
   for entry = 1 to n do 
      bucketnumber = (list[entry].key / shift) mod 10 
      append (bucket[bucketnumber], list[entry]) 
   list = combinebuckets() 
   shift = shift * 10 

分析

对于最长键的每个数字(如果键是字母,则为字母)一次查看每个键。因此,如果最长的键有m个数字并且有n个键,则基数排序的阶数为O(mn)

但是,如果我们看这两个值,则与键的数量相比,键的大小将相对较小。例如,如果我们有六位数字的键,则可能有一百万条不同的记录。

在这里,我们看到密钥的大小并不重要,并且该算法的线性复杂度为O(n)

以下示例显示了Radix排序如何对七个3位数字进行操作。

Input 1st Pass 2nd Pass 3rd Pass
329 720 720 329
457 355 329 355
657 436 436 436
839 457 839 457
436 657 355 657
720 329 457 720
355 839 657 839

在上面的示例中,第一列是输入。其余的列显示了在连续递增的有效数字位置后的列表。用于Radix排序的代码假定n个元素的数组A中的每个元素都有d位,其中位1是最低位,而d是最高位。