博客
关于我
quick sort | 快速排序 C++ 实现
阅读量:794 次
发布时间:2023-03-02

本文共 1266 字,大约阅读时间需要 4 分钟。

Talk is cheap, show me the code

在编程学习中,很多人喜欢谈论算法的优劣,但真正实现代码时却感到困难。以下将以C++语言为例,展示快速排序的递归实现,略作改动使其更易理解。

快速排序的核心思路是通过递归将数组划分为越来越小的子数组,直到每个子数组只有一个元素。以下是实现代码:

void quick_sort_recursive(vector
& a, int start, int end) {
if (start >= end) return;
int base = a[end];
int left = start, right = end - 1;
while (true) {
while (a[left] < base) ++left;
while (a[right] >= base) --right;
if (left >= right) break;
swap(a[left], a[right]);
}
if (a[left] >= a[end]) {
swap(a[left], a[end]);
} else {
++left;
}
quick_sort_recursive(a, start, left - 1);
quick_sort_recursive(a, left + 1, end);
}

需要说明以下几点:

  • while (arr[right] >= mid)的条件中,如果>=改为>会导致无限循环。请亲自模拟排序过程,理解其背后的逻辑。

  • 第一个while循环的作用是找到左边所有小于base的元素的位置。第二个while循环则是找到右边所有大于等于base的元素的位置。当leftright相遇时,执行一次交换操作。

  • 与算法导论中的思路一致,但在实现细节上有所调整。例如,在划分子数组时,通过交换leftright位置来确定基准元素的位置。

  • 以下是一个示例:

    int main() {
    vector
    a{4, 8, 1, 3, 7, 5, 6, 2, 4, 4};
    quick_sort_recursive(a, 0, a.size() - 1);
    return 0;
    }

    在实际使用中,请注意以下几点:

    • 如果if (a[right] <= base)改为<,将导致无限循环。请仔细理解代码逻辑,避免类似错误。

    • 交换操作swap(a[left], a[right])leftright相等时会被跳过,但在实际代码中,这种情况不会出现。

    • 代码与算法导论的思路有所区别,但在实现效果上是等价的。通过对比两者,可以更深入地理解快速排序的工作原理。

    通过以上实现,可以清晰地看到快速排序的递归划分过程。希望对您有所帮助!

    转载地址:http://tetfk.baihongyu.com/

    你可能感兴趣的文章