b排序的例子从编程珍珠
bsort example from programming pearls
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]
一起使用。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 模板元编程 - 尝试实现维度分析
- 我是编程新手
- C++编程从外部文本文件定义数组大小
- 了解算法的性能差异(如果以不同的编程语言实现)
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 使用命名空间正确编程
- C++编程:运算符重载中的引用如何工作?
- Arduino 模块化编程与全局和设置
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 试图修复一个错误,该错误不会让我开始编程其余部分
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- b排序的例子从编程珍珠