PHP 常用例子

基数排序的思想是,输入数据的排序是从最低有效位到最高有效位逐位进行的,它使用计数排序作为子例程来执行排序。计数排序是一种线性排序算法,在所有情况下总时间复杂度为 θ(N+K),其中 N 是未排序数组中的元素数量, K是输入数据的范围。基数排序的思想是扩展计数排序算法,以便在K上升时获得更好的时间复杂度。

示例:

理解基数排序,让我们考虑一个未排序的数组 A = [101, 1, 20, 50, 9, 98, 27, 153, 35, 899] 并讨论按升序对数组进行排序所采取的每个步骤。

第1步:根据算法,输入数据首先根据最低有效位进行排序。因此,数组A[]是根据数字排序的。按数字排序后,将变为[20, 50, 101, 1, 153, 35, 27, 98, 9, 899]

PHP程序 基数排序

第 2 步:在这一步中,数组 A[ ] 数组按照十位进行排序,经过这一步后,它将变成 [101, 1, 9, 20, 27, 35, 50, 153, 98, 899]

PHP程序 基数排序

第 3 步:最后,数组 A[ ] 根据百位(最高有效位)排序,数组将在此步骤之后进行排序,最终数组将为[1, 9, 20, 27, 35, 50, 98, 101, 153, 899]

PHP程序 基数排序

基数排序的实现

<?php
// 基数排序函数
function radixsort(&$Array, $n) {
  $max = $Array[0];
  //查找数组中最大的元素
  for ($i=1; $i<$n; $i++) {  
    if($max < $Array[$i])
      $max = $Array[$i];
  }

  //按照地点进行计数排序。
  //比如个位、十位等等。
  for ($place = 1; $max/$place > 0; $place *= 10) 
    countingsort($Array, $n, $place); 
}

function countingsort(&$Array, $n, $place) {   
  $output = array_fill(0,$n,0);
  
  //对于每个考虑的地方,数字的范围是0-9。
  $freq = array_fill(0,10,0);
  
  //计算freq数组中出现的次数
  for($i = 0; $i < $n; $i++)
    $freq[($Array[$i]/$place)%10]++;

  //更改 count[i] 以便 count[i] 现在包含实际的
  //该数字在输出[]中的位置
  for ($i = 1; $i < 10; $i++) 
      $freq[$i] += $freq[$i - 1];    

  //构建输出数组
  for ($i = $n - 1; $i >= 0; $i--) { 
      $output[$freq[($Array[$i]/$place)%10] - 1] = $Array[$i]; 
      $freq[($Array[$i]/$place)%10]--; 
  }  

  //将输出数组复制到输入数组,现在数组将
  //包含基于指定位置的数字排序的数组
  for ($i = 0; $i < $n; $i++) 
      $Array[$i] = $output[$i]; 
}
  
//打印数组的函数
function PrintArray($Array, $n) { 
  for ($i = 0; $i < $n; $i++) 
    echo $Array[$i]." "; 
  echo "\n";
} 

//测试代码
$MyArray = array(101, 1, 20, 50, 9, 98, 27, 153, 35, 899);
$n = sizeof($MyArray); 
echo "原始数组\n";
PrintArray($MyArray, $n);

radixsort($MyArray, $n);
echo "\n排序数组\n";
PrintArray($MyArray, $n);
?> 

上述代码将给出以下输出:

原始数组
101 1 20 50 9 98 27 153 35 899 

排序数组
1 9 20 27 35 50 98 101 153 899 

时间复杂度:

基数排序的时间复杂度为θ((N+b)*log b(max)) 在所有情况下,其中:

  • N 是未排序数组中的元素数量。
  • b 是输入数组的基数,例如,对于十进制系统,b 为 10。
  • max 是输入数组的最大元素。