C++中的快速排序布尔数组

Quicksorting Boolean Array in C++

本文关键字:布尔 数组 快速排序 C++      更新时间:2023-10-16

您好!我们被要求对布尔数组进行排序,但问题是当我运行程序时,它总是停止工作。我尝试在布尔数组中打印值,然后打印它们,但当我尝试注入快速排序函数时,未排序的值不再打印,数组也不会排序。此代码对除布尔型之外的不同数据类型进行了排序。我希望你能帮我找出问题所在。非常感谢。

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);