#include #include

using namespace std;

int quickSortComparisons(vector& 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;

}

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 了。

C++ 快速排序比较次数计算错误修复:更新交换元素后的 i 和 j 值

原文地址: https://www.cveoy.top/t/topic/omqf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录