【问题标题】:Quicksorting Boolean Array in C++在 C++ 中快速排序布尔数组
【发布时间】:2015-04-14 11:41:40
【问题描述】:

美好的一天!我们被要求对一个布尔数组进行排序,但问题是当我运行我的程序时,它总是停止工作。我尝试打印布尔数组中的值并打印它们,但是当我尝试注入快速排序功能时,未排序的值不再打印,数组也没有排序。此代码对除布尔值之外的不同数据类型进行了排序。我希望你能帮我找到问题。谢谢。

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

【问题讨论】:

  • 已经有交换功能,std::swap
  • 我可以这样做,但我们被特别要求使用快速排序功能/算法对不同的数据类型进行排序。
  • @NeilKirk:不是也已经有了排序功能吗? :)
  • @500-InternalServerError 是的,但我认为这是编写它的任务;)

标签: c++ arrays sorting boolean quicksort


【解决方案1】:

布尔类型在这里有一个优势。您可以简单地计算trues 的数量。

在这种情况下,排序函数应该如下所示:

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 排在第一位)。

【讨论】:

  • 我打算写同样的答案。 :-) 无论如何,我仍然找不到对 0 和 1 进行排序的目的......对我来说似乎有点没用。
  • @TobiasKnauss,是的,两个变量就足够了:虚构数组的大小和其中的true(或false)值的数量。这是这样一个数组将代表的所有实际信息:)
  • @TobiasKnauss 您可能会看到使用bool 键对结构数组进行排序的一些目的。在实际应用中,我们一般通过一些属性对一些对象进行排序,单独排序简单的值通常只是一个练习。
  • @CiaPan:但我认为,这也可以更容易解决。解决方案 1:创建 2 个列表,一个包含包含 bool=true 的结构,一个包含其余的。解决方案2,如果你真的请求一个数组:计算真假,然后创建第二个数组,再次运行第一个数组,将结构或其引用复制到第二个数组。 true 的结构从 0 开始,其他的 index=true 的计数,反之亦然。
【解决方案2】:

这段代码对除布尔值之外的不同数据类型进行了排序——我对此表示怀疑。您是否尝试过对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);

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多