本文共 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的元素的位置。当left和right相遇时,执行一次交换操作。
与算法导论中的思路一致,但在实现细节上有所调整。例如,在划分子数组时,通过交换left和right位置来确定基准元素的位置。
以下是一个示例:
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])在left和right相等时会被跳过,但在实际代码中,这种情况不会出现。
代码与算法导论的思路有所区别,但在实现效果上是等价的。通过对比两者,可以更深入地理解快速排序的工作原理。
通过以上实现,可以清晰地看到快速排序的递归划分过程。希望对您有所帮助!
转载地址:http://tetfk.baihongyu.com/