C++ 快速排序划分算法

C++ 快速排序划分算法,c++,algorithm,sorting,quicksort,C++,Algorithm,Sorting,Quicksort,正确的输出应为: 8 2 5 13 4 19 12 6 3 11 10 7 9 但实际产出是: 6 2 5 7 4 3 8 12 19 11 10 13 9 该算法必须将13与7交换,但由于上述循环中的&条件,该算法失败。只有当a[left]>=pivot时,我才想增加left,只有当a[right]你或多或少回答了你自己的问题时,我才想减少right。您可能希望执行以下操作: 6 2 5 13 4 3 8 12 19 11 10 7 9 void分区(int*a,int size){ i

正确的输出应为:

8 2 5 13 4 19 12 6 3 11 10 7 9
但实际产出是:

6 2 5 7 4 3 8 12 19 11 10 13 9

该算法必须将
13
7
交换,但由于上述循环中的
&
条件,该算法失败。只有当
a[left]>=pivot
时,我才想增加
left
,只有当
a[right]你或多或少回答了你自己的问题时,我才想减少
right
。您可能希望执行以下操作:

6 2 5 13 4 3 8 12 19 11 10 7 9
void分区(int*a,int size){
int pivot=a[0];
int左,右;
用于(左=1,右=尺寸-1;左<右;)
{

如果(a[left]>pivot&&a[right]您或多或少地回答了自己的问题。您可能希望执行以下操作:

6 2 5 13 4 3 8 12 19 11 10 7 9
void分区(int*a,int size){
int pivot=a[0];
int左,右;
用于(左=1,右=尺寸-1;左<右;)
{

如果(a[left]>pivot&&a[right]这里有另一个选项,与原来的选项稍微相似

void partition(int *a, int size) {
    int pivot = a[0];
    int left, right;
    for(left = 1, right = size-1; left < right; )
    {
        if(a[left] > pivot && a[right] <= pivot)
        {
            swap(left, right, a);
        }
        if(a[left] <= pivot) left++;
        if(a[right] > pivot) right--;
    }
}

这是另一个选项,与原来的选项稍有相似

void partition(int *a, int size) {
    int pivot = a[0];
    int left, right;
    for(left = 1, right = size-1; left < right; )
    {
        if(a[left] > pivot && a[right] <= pivot)
        {
            swap(left, right, a);
        }
        if(a[left] <= pivot) left++;
        if(a[right] > pivot) right--;
    }
}

以防万一,这不是一种学习练习:@111111:考虑到这个问题,
std::partition
将是更合适的参考。@111111:我希望他不太合适。然而,我年纪太大了,我实际上是轮子的原始发明者。:-@111111:不,他发明了轮子-它是正方形(有时是圆形的)在独轮车、自行车、手推车和汽车上都可以找到。我希望这是一个家庭作业:在选择pvot的情况下,退化的情况会被排序,或者几乎被排序。对于其余的情况,最简单(但不是最优的)进行分区的解决方案是Jon Bentley在《编程珍珠》一书中使用的解决方案。我见过的所有其他解决方案都或多或少有一些棘手的边缘条件。以防这不是某种学习练习:@111111:考虑到这个问题,
std::partition
将是更合适的参考。@111111:我希望他不太可能。然而,我年纪太大了,实际上我是轮子的原始发明者。:-@111111:不,他发明了轮子——它是正方形(有时是圆形的)在独轮车、自行车、手推车和汽车上都可以找到。我希望这是一个家庭作业:在选择pvot的情况下,退化的情况会被排序,或者几乎被排序。对于其余的情况,最简单(但不是最优的)进行分区的解决方案是Jon Bentley在其编程珍珠书中使用的解决方案。我所看到的所有其他解决方案都或多或少有一些棘手的边缘条件。值得一提的是,使用第一个元素作为分区轴是一种不好的做法,因为在排序/几乎排序的数组中,快速排序会退化到最坏的情况,这与尽管我们希望它是罕见的。值得一提的是,使用第一个元素作为分区轴心是一种不好的做法,因为在排序/几乎排序的数组上,快速排序会退化到最坏的情况——这并不像我们希望的那样罕见。