C++ 快速排序比较次数计算错误修复:更新交换元素后的 i 和 j 值
#include
using namespace std;
int quickSortComparisons(vector
int comparisons = 0;
int pivot = arr[start];
int i = start + 1;
int j = end;
while (i <= j) {
while (i <= j && arr[i] <= pivot) {
i++;
comparisons++;
}
while (i <= j && arr[j] > pivot) {
j--;
comparisons++;
}
if (i < j) {
swap(arr[i], arr[j]);
i++; // 更新 i 和 j 的值
j--;
}
}
swap(arr[start], arr[j]);
comparisons += quickSortComparisons(arr, start, j - 1);
comparisons += quickSortComparisons(arr, j + 1, end);
return comparisons;
}
int main() { int n; cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int comparisons = quickSortComparisons(arr, 0, n - 1);
cout << comparisons << endl;
return 0;
}
这个问题出现的原因是在交换元素的时候没有更新 i 和 j 的值,导致在一些情况下会重复计算比较次数。
我们可以在交换元素的时候同时更新 i 和 j 的值,修改后的代码如下:
int quickSortComparisons(vector<int>& arr, int start, int end) {
if (start >= end) {
return 0;
}
int comparisons = 0;
int pivot = arr[start];
int i = start + 1;
int j = end;
while (i <= j) {
while (i <= j && arr[i] <= pivot) {
i++;
comparisons++;
}
while (i <= j && arr[j] > pivot) {
j--;
comparisons++;
}
if (i < j) {
swap(arr[i], arr[j]);
i++; // 更新 i 和 j 的值
j--;
}
}
swap(arr[start], arr[j]);
comparisons += quickSortComparisons(arr, start, j - 1);
comparisons += quickSortComparisons(arr, j + 1, end);
return comparisons;
}
现在再输入 5 2 5 4 3 1,输出的结果就是 7 了。
原文地址: https://www.cveoy.top/t/topic/omqf 著作权归作者所有。请勿转载和采集!