我正在尝试为我的算法课程做一个快速排序作业,由于某种我不知道的原因,我无法弄清楚为什么我的代码跳过快速排序部分(由“//”包围),这令人沮丧我。
代码的目标是重新排列向量,使负数位于前面,然后是零,然后是正数。
代码现在的工作方式是,我从 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);
}
简短的答案是跳过代码,因为
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,因此会跳过该代码。