基数排序radix_sort

<?php

/**
 * 基数排序
 */
function radix_sort($arr)
{
    $len = count($arr);
    if ($len <= 1) {
        return $arr;
    }

    $max = $arr[0];
    for ($i = 0; $i < $len; $i++) {
        if ($arr[$i] > $max) {
            $max = $arr[$i];
        }
    }

    $digit = 0;
    while (pow(10, $digit) <= $max) { #根据不同的位数对数组进行桶排序,个位:10(0)、十位:10(1)、百位:10(2)...
        $buckets = [];
        for ($i = 0; $i < 10; $i++) {
            $buckets[$i] = [];
        }
        for ($j = 0; $j < $len; $j++) {
            $remainder = intval($arr[$j] / pow(10, $digit)) % 10; // 在某个数位的数字,先除以10(digit)再取余10
            $buckets[$remainder][] = $arr[$j]; #放入桶内
        }

        $arr = [];
        for ($k = 0; $k < 10; $k++) {
            $bucket_len = count($buckets[$k]);
            if ($bucket_len > 0) {
                for ($l = 0; $l < $bucket_len; $l++) {
                    $arr[] = $buckets[$k][$l]; #重新写回序列中
                }
            }
        }

        $digit++;
    }
    return $arr;
}

//$arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48];
//$arr = [1, 2, 3, 1, 1, 1];
//$arr = range(1, 20);
$arr = array_merge(range(1, 100), range(1, 100));
shuffle($arr);
echo join(',', $arr) . "\n";
$arr = radix_sort($arr);
echo join(',', $arr) . "\n";

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值