PHP二进制基数排序实现

问题描述

我正在尝试以二进制形式实现基数排序,因为我想检查移位操作的速度是否平衡了所需的步数。 我的计数排序似乎有效,但是一旦我对基数排序进行了多次通过,结果就会中断。 任何帮助都将不胜感激。

<router-link class="nav-link" :to="{ name: 'subs',params: { sid: subscription.Id }}">
  {{ subscription.Number }}
</router-link>

解决方法

好吧,感谢一位朋友,我发现了我的问题:我使用的计数排序实现使用计数器作为最高索引来堆叠相同的数字,然后对其递减。计数排序(一个迭代)是可以的,但是当您将其用于基数排序(多个计数排序迭代)时,它会加扰所有内容。

因此,我改用一种方法,即您将计数器右移一次,这将为您提供起始点的n + 1位数字,然后递增它。

蓬勃发展,你很好。

function countSort2(&$arr,$digit) {
    $bits = $output = array_fill(0,NB_ELEMS,0); // output array  
    $count = [0,0];
  
    // Store count of occurrences in count[]  
    for ($i = 0; $i < NB_ELEMS; $i++) {
        $nb = $arr[$i];
        $bit = ($nb >> $digit) & 1;
        $bits[$i] = $bit;
        $count[$bit]++;
    }
    // Cumulative count shifted
    $count[1] = $count[0];
    $count[0] = 0;

    // Rearranging
    for ($i = 0; $i < NB_ELEMS; $i++) {
        $nb = $arr[$i];
        $bit = $bits[$i];
        $output[$count[$bit]] = $nb;
        $count[$bit]++;
    }

    // Switch arrays
    $arr = $output;
}  

我还进行了一些测试(1M个项目,最大值1M,100次迭代),并且使用一种存储值而不是对它们进行计数的方法,此后合并似乎是速度的两倍(此后才起作用)。无论如何,这两种方法都远远不能满足本机排序性能。 任何评论表示赞赏

function byDigitSortArrayMerge(&$arr,$digit) {
    $output = array_fill(0,NB_ELEMS - 1,0); // output array  
    $bits = array_fill(0,0); // output array
    $by_bit = [[],[]];
  
    // Store count of occurrences in count[]  
    for ($i = 0; $i < NB_ELEMS; $i++) {
        $nb = $arr[$i];
        $bit = ($nb >> $digit) & 1;
        $by_bit[$bit][] = $nb;
    }
    $arr = array_merge($by_bit[0],$by_bit[1]);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...