【问题标题】:Sorting (Quicksort) ,Partition排序(快速排序),分区
【发布时间】:2014-05-04 02:48:32
【问题描述】:
void swap(int *a,int *b)
{
   int temp;

   temp=*a;
   *a=*b;
   *b=temp;
}

void partition(int a[],int size)
{
   int *right,*left,pivot=a[0],temp;

   right=&a[size-1];
   left=&a[0];
   while(1)
   {
      while(*left<=pivot)
      {
         left+=1;
      }

      while(*right>pivot)
      {
         right-=1;
      }

      if(right<left)
      {
         swap(&a[0],right);
         break;
      }

      swap(right,left);
   }
}

这段代码对吗?枢轴被放置在正确的位置,但在hackerrank,他们说右边的部分应该按升序排序,而数组的左边部分应该按降序排列。强>

【问题讨论】:

  • 这段代码对吗? -- 试试执行?
  • 代码看起来不完整。你从左边跑到第一个在错误边的元素,从右边开始,然后交换它们,然后打破循环。所以你只交换一对?如果还有更多呢?还有递归调用丢失。
  • 这是分区而不是快速排序的代码,所以我认为不会有任何递归调用。代码运行正确,因为枢轴被放置在正确的位置,但我担心枢轴左右两侧的元素顺序。

标签: c algorithm sorting quicksort


【解决方案1】:

您的代码不对:它没有对数组进行稳定的分区。

想象一下你的数组是

100, 33, 333, 22, 222, 11

在第一个元素周围稳定划分后,它应该变成

33, 22, 11, 100, 333, 222
// 33, 22, and 11 in the same order as in the original array
// 333 and 222 in the same order as in the original array

但是,相反,它变成了

22, 11, 33, 100, 222, 333

请注意,这种分区实现对于不稳定的快速排序是可以的:枢轴元素位于最终位置,其左侧的所有元素都较小,而其右侧的所有元素都较大。

【讨论】:

    【解决方案2】:

    Quicksort 中,您并没有真正对每个分区中的元素进行排序。

    选择一个枢轴值并进行分区后,枢轴左侧的所有元素都小于枢轴,但以任意顺序;所有大于枢轴的元素都在其右侧以任何顺序;枢轴位于其最终位置。

    因此,hackerrank 是错误的,或者更有可能是您误解了他们所说的内容。

    【讨论】:

    • 看起来他们想要一个快速排序的稳定实现。我从那里得到的是:“数字应该保持相同的顺序” 这与数字应该按顺序不同。请注意,对于一般的 QuickSort 实施,此要求不是强制性的。
    • 所以基本上你是想告诉我,如果我同时使用快速排序算法,这个分区就可以正常工作?
    • 基本上,我是说 QuickSort 不是一种稳定的算法,但您可以选择以稳定的方式实现它。
    猜你喜欢
    • 2015-10-28
    • 2018-09-13
    • 2013-12-08
    • 2010-12-06
    • 2021-06-11
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多