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