PHP基数排序(LSD模式)

相比起 MSD 模式的基数排序 , LSD 的实现简略了不少 , 直接贴代码 .


function GetNumInPos($num, $pos){
  $temp = 1;
  for ($i = 0; $i < $pos - 1; $i++)
    $temp *= 10;

  return ($num / $temp) % 10;
}

function LsdRadixSort($a, $d) {

  $l = count($a);
  $bucket = array();
  for($i=0; $i<10; $i++) $bucket[$i] = array(0);
  
  // 由低 $p=1 至高位 $p<=$d 循环排序
  for($p=1; $p<=$d; $p++) {
    
    // 将对应数据按当前位的数值放入桶里
    for($i=0; $i<$l; $i++) {
      $n = GetNumInPos($a[$i], $p);
      $index = ++$bucket[$n][0];
      $bucket[$n][$index] = $a[$i];
    }
    
    // 收集桶里的数据
    for($i=0, $j=0; $i<10; $i++) {
      for($num = 1; $num<=$bucket[$i][0]; $num++) $a[$j++] = $bucket[$i][$num];
      $bucket[$i][0] = 0;
    }
  }
  
  $bucket = null;// 习惯性释放内存
  return $a;

}


用法 :

echo(implode(",", LsdRadixSort($a, $int)));// $int 是位数 , 最大几位就填几


欢迎各位大神指点哈 .

你可能感兴趣的:(数据结构,算法,基数排序)