美好的一天!我们被要求对一个布尔数组进行排序,但问题是当我运行我的程序时,它总是停止工作。我尝试在布尔数组中打印值并打印它们但是当我尝试注入快速排序功能时,未排序的值不再打印,也不对数组进行排序。此代码对除Boolean之外的不同数据类型进行了排序我希望你能帮我找到问题所在。谢谢。
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;
}
答案 0 :(得分:5)
布尔类型在这里有优势。您只需计算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
先行)。
答案 1 :(得分:0)
此代码对除布尔以外的其他数据类型进行了排序 - 我对此表示怀疑。您是否尝试对int
数组进行排序,比如int arr[4] = {4, 4, 4, 4}
...?
你的代码在处理分区时有一个缺陷:当要分区的N项子阵列由相同的项组成时,partition()
中的第二个内部循环以header==p
终止,你得到N的分区零件。这会导致无限递归并导致堆栈溢出导致崩溃。
您需要跳过对枢轴项目的排序 - 在分区后它处于最终位置并且不再需要触摸:
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);