Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 快速排序-中间枢轴实现奇怪的行为_C++_Algorithm_Sorting_Quicksort - Fatal编程技术网

C++ 快速排序-中间枢轴实现奇怪的行为

C++ 快速排序-中间枢轴实现奇怪的行为,c++,algorithm,sorting,quicksort,C++,Algorithm,Sorting,Quicksort,我正在尝试使用各种在线教程实现快速排序,将pivot值作为向量的中间元素。 尽管它对一些样本有效,但有一个我无法得到排序向量 示例-输入{5,3,8,6,1,0,4},但输出为{0,3,4,5,1,6,8} 快速排序实现 void quickSortMiddle(vector<int> &a, int left, int right) { if(left >=right) return; int leftI = left; int rightI

我正在尝试使用各种在线教程实现快速排序,将pivot值作为向量的中间元素。 尽管它对一些样本有效,但有一个我无法得到排序向量

示例-输入{5,3,8,6,1,0,4},但输出为{0,3,4,5,1,6,8}

快速排序实现

void quickSortMiddle(vector<int> &a, int left, int right)
{
    if(left >=right) return;

    int leftI = left;
    int rightI = right;

    int pivot = left + (right - left)/2;

    while(leftI<=rightI)
    {
        while(a[leftI] < a[pivot] )leftI++;
        while(a[rightI] > a[pivot])rightI--;

        if(leftI <=rightI)
        {
            swap(a[leftI], a[rightI]);
            leftI++;
            rightI--;
        }
    }

    if(left <= rightI)quickSortMiddle(a,left,rightI);
    if(leftI <= right)quickSortMiddle(a,leftI,right);
}
5340168

0345168

0345168

0345168

final : 
0345168

问题是使用[pivot]而不是设置pivot=a[left+(right-left)/2]。您使用此修复程序的版本:

void quickSortMiddle(vector<int> &a, int left, int right)
{
    if(left >=right) return;
    int leftI = left;
    int rightI = right;
    int pivot = a[left + (right - left)/2]; // set pivot to value
    while(leftI<=rightI)
    {
        while(a[leftI]  < pivot )leftI++;   // use pivot by value
        while(a[rightI] > pivot )rightI--;  // use pivot by value
        if(leftI <=rightI)
        {
            swap(a[leftI], a[rightI]);
            leftI++;
            rightI--;
        }
    }
    if(left < rightI)quickSortMiddle(a,left,rightI); // < not <=
    if(leftI < right)quickSortMiddle(a,leftI,right); // < not <=
}
void quickSortMiddle(向量&a、左整数、右整数)
{
如果(左>=右)返回;
int leftI=左;
int rightI=右;
int pivot=a[left+(right-left)/2];//将pivot设置为value
while(leftI pivot)rightI--;//按值使用pivot
如果(左i=右i)中断;
交换(a[leftI],a[rightI]);
}
quickSortMiddle(a、左、右i);
quickSortMiddle(a,右i+1,右);
}

您试过调试它吗?是的。我认为当左索引和右索引位于同一个元素(即1)上时,它就不起作用了。问题是,一旦leftI或rightI等于pivot,交换[leftI]和[rightI]会改变[pivot]的值。您需要将[pivot]复制到单独的变量中。(或者,如果复制数组元素的成本很高,请修改pivot以指向交换后pivot所在的位置)。是的,在@rcgldr指出后,我后来意识到了这一点。我会记住的。谢谢你的帮助。谢谢。这花了很多时间。@NadNone-我删除了以前的评论,因为它不再需要了。您可能想删除您的评论。稍后我将删除此评论。
void quickSortMiddle(vector<int> &a, int left, int right)
{
    if(left >= right) return;
    int pivot = a[left + (right - left)/2];
    int leftI = left-1;
    int rightI = right+1;
    while(1)
    {
        while(a[++leftI] < pivot);
        while(a[--rightI] > pivot);
        if(leftI >= rightI)break;
        swap(a[leftI], a[rightI]);
    }
    quickSortMiddle(a,left,rightI);
    quickSortMiddle(a,rightI+1,right);
}