C++中的快速排序布尔数组
Quicksorting Boolean Array in C++
您好!我们被要求对布尔数组进行排序,但问题是当我运行程序时,它总是停止工作。我尝试在布尔数组中打印值,然后打印它们,但当我尝试注入快速排序函数时,未排序的值不再打印,数组也不会排序。此代码对除布尔型之外的不同数据类型进行了排序。我希望你能帮我找出问题所在。非常感谢。
void swap(bool &a, bool &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void sortArray(bool* arr, int start, int end)
{
int pivot = arr[start];
int p;
if(end > start)
{
p = partition(arr, pivot, start, end);
arr[p] = pivot;
sortArray(arr, start, p);
sortArray(arr, p+1, end);
}
}
int partition(bool* arr, int pivot, int start, int end)
{
int header = start;
int p = end;
while(header < p)
{
while( pivot < arr[p] && p > header)
{
p=p-1;
}
swap(arr[header], arr[p]);
while( pivot >= arr[header] && header < p)
{
header++;
}
swap(arr[p], arr[header]);
}
return header;
}
布尔类型在这里有优势。您可以简单地计算true
s的数量。
在这种情况下,排序函数应该看起来像:
void sortArray(bool* arr, int start, int end)
{
int true_count = 0;
for (int i = start; i != end; ++i) {
if (arr[i]) {
++true_count;
}
}
int true_range_end = start + true_count;
// Here go true
for (int i = start; i != true_range_end; ++i) {
arr[i] = true;
}
// Here go false
for (int i = true_range_end; i != end; ++i) {
arr[i] = false;
}
}
注意这是一个降序(true
优先)。
这段代码对不同的数据类型进行了排序,除了布尔型——我对此表示怀疑。你试过对int
的数组进行排序吗,比如int arr[4] = {4, 4, 4, 4}
。。。?
您的代码在处理分区时有一个缺陷:当要分区的N项子数组由相等的项组成时,partition()
中的第二个内部循环以header==p
结束,您将得到N项和ZERO项的分区。这会导致无限递归,并导致堆栈溢出导致崩溃。
您需要跳过对数据透视项的排序——分区后,它处于最终位置,不需要再被触摸:
p = partition(arr, pivot, start, end);
arr[p] = pivot; // this item done
sortArray(arr, start, p-1); // skip it in recursion <<<<<<<<
sortArray(arr, p+1, end);
相关文章:
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- 以十为基数的数字到布尔数组,该数组要求二进制/基数为 2 的数字
- 存储另一个函数返回的布尔数组时遇到问题
- 尝试设置唯一指针布尔数组的值时BAD_ACCESS错误
- C++ CopyMemory 和布尔数组
- 将uint64_t位掩码转换为 std::布尔数组
- 使用 true 初始化布尔数组时出现问题
- CRC32 C++使用布尔数组和手动逐位异或实现
- 带有布尔数组成员的 C++ 结构.如何在主代码中使用
- 使用动态布尔数组时出现问题
- 以C++为单位旋转布尔数组
- 将 __m128i?布尔数组中每个布尔字节的低位提取到打包的位图
- 给定一个大小的布尔数组,这都是真实的,我将如何仅使用递归将所有值设置为false
- 在动态2D布尔数组中更改一个值似乎会更改不同数组中不同位置的值
- 将十六进制数转换为布尔数组
- 使用布尔数组时出现 Openmp 错误
- C++11 为什么 cout 从布尔数组打印大整数
- 使用 c++ 中的函数初始化 const 布尔数组
- 整数到布尔数组
- 使用SSE内部函数将布尔数组(8字节布尔)转换为int或char