b排序的例子从编程珍珠

bsort example from programming pearls

本文关键字:编程 珍珠 排序      更新时间:2023-10-16

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* 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]一起使用。