Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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,根据Cormen对算法的介绍,我正在尝试自己实现快速排序。 我有以下代码,但也有问题: void quickSort(Node* left, Node* right) { Node* start = left; Node* cur = left->next; if (left == right) return; while (cur != right) { if (start->data < cur->data) swa

根据Cormen对算法的介绍,我正在尝试自己实现快速排序。 我有以下代码,但也有问题:

void quickSort(Node* left, Node* right) {
    Node* start = left;
    Node* cur = left->next;

    if (left == right) return;

    while (cur != right) {
        if (start->data < cur->data) swap(start->data,cur->data);
        cur = cur->next;
    }

    swap(left->data,cur->data);

    Node* oldCur = cur;
    cur = getPrevious(cur);
    if (cur != nullptr && (getPrevious(left) != cur) && (cur->next != left)) quickSort(left,cur);

    cur = oldCur->next;
    if (cur != nullptr && (getPrevious(cur) != right) && (right->next != cur)) quickSort(cur, right);
}
但对于奇数个输入数据,输出如下所示

7 6 5 8 4 2 1 
1 2 5 4 6 7 8 
我想在算法的分区部分有个问题,但我找不到

编辑

我可能发现了一个问题,并稍微修改了算法。现在我找不到任何反例,但如果有人看到任何错误,请指出:-)

void快速排序(节点*左,节点*右){
节点*开始=左;
节点*cur=左;
T pivot=开始->数据;
如果(左==右)返回;
如果(左->下一步==右){
如果(右->数据<左->数据)交换(左->数据,右->数据);
返回;
}
交换(开始->数据,右->数据);
while(cur!=右->下一步){
如果(当前->数据<透视){
交换(当前->数据,开始->数据);
开始=开始->下一步;
}
cur=cur->next;
}
交换(右->数据,开始->数据);
快速排序(左,开始);
如果(开始->下一步!=nullptr)快速排序(开始->下一步,右);
}

为什么不在调试器中单步执行代码,亲自看看那里发生了什么?我建议首先重写它,使其看起来更像规范的快速排序:检查是否完成。如果不是:分区(),快速排序(),快速排序()。如果你没有完成,你应该总是做2个递归调用,我不明白为什么你的两个都被检查。我同意NPE:如果这是为了你的学习,你自己调试,这你会学到最多。如果它打算用在一些真实的代码中,请改用
std::sort
。我不得不问,这真的是作业的目的吗?我理解快速排序,但值交换?在某种程度上,动态节点列表的要点是,您不必进行值交换:您可以重新排列指针。也就是说,值始终保留在其
节点中,并且只有指向每个节点的点才会更改。我知道它不能解决您的问题,但也许可以再次检查该作业,确保该作业不是链表操作,而是简单的值交换。我不愿意看到你为了一个一开始就不正确的解决方案而自杀。@NPE,我已经做了一段时间了,但没有成功。稍作休息后,我用一张纸和一支铅笔“重新运行”我的算法,发现了一个可能的问题@WhozCraig,在我的
节点
实现中,我只存储指向数据和下一个的指针,所以值交换实际上只是指针交换。我咨询了我的博士学位,这种列表操作是可以的,因为作业只是关于快速排序,而不是关于高级列表学习。
7 6 5 8 4 2 1 
1 2 5 4 6 7 8 
void quickSort(Node* left, Node* right) {
    Node* start = left;
    Node* cur = left;
    T pivot = start->data;

    if (left == right) return;
    if (left->next == right) {
        if (right->data < left->data) swap(left->data,right->data);
        return;
    }

    swap(start->data,right->data);

    while (cur != right->next) {
        if (cur->data < pivot) {
            swap(cur->data,start->data);
            start = start->next;
        }
        cur = cur->next;
    }

    swap(right->data,start->data);

    quickSort(left, start);
    if (start->next != nullptr) quickSort(start->next, right);
}