来自编程珍珠的示例
Posted
技术标签:
【中文标题】来自编程珍珠的示例【英文标题】:bsort example from programming pearls 【发布时间】:2011-12-08 05:23:39 【问题描述】:在 Programming Pearls 中有一种算法可以对不同长度的数组进行排序,但排序的时间与它们的长度之和成正比。例如,如果我们有一个记录数组x[0...n-1]
,每条记录都有一个整数长度和一个指向数组bit[0...length-1]
的指针。
代码是这样实现的:
void bsort(l, u, depth)
if (l >= u)
return ;
for (i = l; i <= u; i++)
if (x[i].length < depth)
swap(i, l++);
m = l;
for (int i = l; i < u; i++)
if (x[i].bit[depth] == 0)
swap(i, m++);
bsort(l, m - 1, depth + 1);
bsort(m, u, depth + 1);
我的问题是,鉴于记录:
x[6] = "car", "bus", "snow", "earth", "dog", "mouse"
我知道如何获取字符串长度,但是位数组呢?我怎样才能制作一个适合这个字符串数组的位数组?甚至x[i].bit[depth]
我该如何实现呢?
【问题讨论】:
我试图清理这个,但你的问题仍然不是很清楚。基本上你正在考虑对char[]
进行排序并且你想知道是否可以对位数组进行排序?我认为这取决于您的位数组是如何实现的。
我想说的是,我也不清楚如何用字符串的记录实现位排序,看不懂
【参考方案1】:
字符数组(或任何其他类型,就此而言)也是位数组 - 毕竟,字符是由位组成的。所以你不必创建一个单独的数组,你只需要找到一种方法来访问数组中的给定位。为此,您必须使用一些位操作。您可以在这里找到一些如何做到这一点的示例:Any smarter way to extract from array of bits?。
基本上,您首先必须找出所需位所在的字节,然后获取该特定位的值。顺带一提:
char* array = "the array";
int required_bit = 13;
int bit = required_bit & 0x7; // get the bit's offset in its byte
int byte = required_bit >> 3; // get the bit's byte
int val = (array[byte] >> bit) & 0x1; // check if the bit is 1
现在将其包装在一个函数中(可能会进行额外的绑定检查,以确保给定的required_bit
不在数组之外),并与x[i]
一起使用。
【讨论】:
这是一个很好的答案@eran,只有一个问题假设我们有整数数组而不是字符串数组,然后 x[i].length 它是代表这个数字的位数是吗? x[i].bit[depth] 它是位置深度的位数是吗? 您不能使用x[i].length
来获取数组的长度,这不是Java... 对于字符串,您可以使用strlen
。对于整数,您必须将大小与数组一起传递。此外,您没有 bit[depth]
部分 - 您在 x[i]
上工作。最后,如果您有一个 int 数组,则必须进行一些更改 - int 不是 1 个字节,因此 array[byte]
不会访问 byte
字节,而是 byte
int。最简单的方法是将int*
转换为char*
。
对不起@eran,但我已经很困惑了,在我的示例中我的代码将如何编写?我在示例中显示了字符串数组,请告诉我我的代码看起来如何?
您应该首先创建一个int get_bit(char* array, int bitpos)
函数。然后,将其称为int bit_val = get_bit(x[i], depth)
(假设depth
是您感兴趣的值)。这将为您提供x[i]
数组中的depth
位。
但是 x[i] 是字符数组而不是一个字符是吗?或者没关系以上是关于来自编程珍珠的示例的主要内容,如果未能解决你的问题,请参考以下文章
代码在 Visual c++ 中无法按预期工作(来自 bjarne stroustrup 编程和原则书 2n 版的示例)