gpt4 book ai didi

java - 关于Java中基数排序实现的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:31 28 4
gpt4 key购买 nike

以下基数排序执行四次计数排序(256 个桶,32 位整数,从最低有效数字开始),取自 Sedgewick's Algorithms textbook .

public class LSD {
private final static int BITS_PER_BYTE = 8;

// LSD sort an array of integers, treating each int as 4 bytes
// assumes integers are nonnegative
// [ 2-3x faster than Arrays.sort() ]
public static void sort(int[] a) {
int BITS = 32; // each int is 32 bits
int W = BITS / BITS_PER_BYTE; // each int is 4 bytes
int R = 1 << BITS_PER_BYTE; // each bytes is between 0 and 255
int MASK = R - 1; // 0xFF

int N = a.length;
int[] aux = new int[N];

for (int d = 0; d < W; d++) {

// compute frequency counts
int[] count = new int[R+1];
for (int i = 0; i < N; i++) {
int c = (a[i] >> BITS_PER_BYTE*d) & MASK;
count[c + 1]++;
}

// compute cumulates
for (int r = 0; r < R; r++)
count[r+1] += count[r];

// for most significant byte, 0x80-0xFF comes before 0x00-0x7F
if (d == W-1) {
int shift1 = count[R] - count[R/2];
int shift2 = count[R/2];
for (int r = 0; r < R/2; r++)
count[r] += shift1;
for (int r = R/2; r < R; r++)
count[r] -= shift2;
}

// move data
for (int i = 0; i < N; i++) {
int c = (a[i] >> BITS_PER_BYTE*d) & MASK;
aux[count[c]++] = a[i];
}

// copy back
for (int i = 0; i < N; i++)
a[i] = aux[i];
}
}

我理解除这部分之外的大部分代码:

if (d == W-1) {
int shift1 = count[R] - count[R/2];
int shift2 = count[R/2];
for (int r = 0; r < R/2; r++)
count[r] += shift1;
for (int r = R/2; r < R; r++)
count[r] -= shift2;
}

这段代码的目的是什么?谢谢!

最佳答案

代码块完全按照评论所说:

for most significant byte, 0x80-0xFF comes before 0x00-0x7F

这样做的原因是:因为你正在使用 int , 所以最高有效位是 sign 位。因此,最高有效字节在 0x80-0xFF 范围内的数字是负数,所以应该放在正数之前,正数的最高有效字节在 0x00-0x7F 范围内.

如果你问代码块是如何实现的,这里有一个简单的想法:

既然您了解数据是如何移动的,那么我假设您了解 count[] 的作用在整个代码中做。在代码块中,R是上限,即0xFF + 1 , 和 R / 20x7F + 1 .因此count[R] - count[R / 2]0x80范围内的总数至 0xFF .因此,通过添加 count[R] - count[R / 2] 的类次至 count[0 .. R / 2]并从 count[R / 2 .. R] 中减去它将帮助 0x00 范围内的数字至 0x7F有更高的count值高于 0x80 范围内的数字至 0xFF ,这导致 0x80-0xFF 最终出现在 0x00-0x7F 之前

最后,你可能会好奇:如果第一位是符号位,为什么11111111大于10000001 ?那不是-(127) < -(1)吗?这是因为在计算机系统中,我们使用的是2's compliment。而不是有符号整数,因此 11111111实际上意味着 -1 , 和 10000001实际上意味着 -127 .

关于java - 关于Java中基数排序实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597831/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com