为什么“If 语句”被跳过?

问题描述 投票:0回答:1

我正在尝试为我的算法课程做一个快速排序作业,由于某种我不知道的原因,我无法弄清楚为什么我的代码跳过快速排序部分(由“//”包围),这令人沮丧我。

代码的目标是重新排列向量,使负数位于前面,然后是零,然后是正数。

代码现在的工作方式是,我从 main() 中得到一个未排序的数组(即“u”),然后我将该数组划分为 2 个子数组,其中中间作为我的枢轴。然后,我使用快速排序对代码进行排序,使用第一个元素作为该特定子数组的主元。

但是,当我调试时,我在“if(右< i)" statement section, which is the Quicksort portion, it would skip the "if (right < i)" statement section and move on.

)”之前和之后设置了断点
#include <iostream>
#include <vector>

using namespace std;

void orderVector(vector<double>& u) {
    if (u[0] < u[u.size() - 1]) {
        int pivotIndex = (u.size() / 2);
        vector<double> s_lower, s_upper;
        for (int i = 0; i < pivotIndex; i++) {
            s_lower.push_back(u[i]);
        }
        for (int i = pivotIndex + 1; i < u.size(); i++) {
            s_upper.push_back(u[i]);
        }

        // Order the vectors
        int left, i;
        // Lower
        left = 0;
        double pivot = s_lower[left];
        i = left;
        int right = (s_lower.size() - 1);

// Quicksort Portion skipped
        if (right < i) {
            while (pivot <= s_lower[i] && pivot >= s_lower[right]) {
                i++;
                right--;
                swap(s_lower[i], s_lower[right]);
            }
        }
// (end of portion skipped)
        swap(s_lower[left], s_lower[right]);

        /*
        vector<double> sorted;
        sorted.insert(sorted.end(), s_lower.begin(), s_lower.end());
        sorted.insert(sorted.end(), s_upper.begin(), s_upper.end());*/

        for (auto x : s_lower)
            cout << x << " ";
    }
}

int main() {
    vector<double> unsorted = {-1, 2, -3, 4, 5, 6, -7, 8, 9};
    orderVector(unsorted);
}
c++ algorithm quicksort
1个回答
0
投票

简短的答案是跳过代码,因为

i < right
为 false。

跟踪代码,尽管

main
中的向量大小为 9,这意味着函数中的向量
u
具有相同的大小。现在

pivotIndex = u.size() / 2;

pivotIndex
等于 4。因此,将四个数字推到
s_lower
上,即
s_lower.size()
等于 4。然后

int right = (s_lower.size() - 1);

所以

right
等于 3。

现在考虑

i
,我们有
left = 0;
,然后
i = left;
,因此
i
等于 0。

这意味着

right < i
为 false,因此会跳过该代码。

© www.soinside.com 2019 - 2024. All rights reserved.