快速排序算法详解
快速排序是一种基于分治策略的高效排序算法。其基本思想如下:
- 分解: 选择一个基准元素,将数组分为两个子序列,使得左侧子序列的所有元素都不大于基准元素,右侧子序列的所有元素都大于基准元素。
- 治理: 对两个子序列分别进行快速排序。
- 合并: 将排好序的两个子序列合并在一起,得到原问题的解。
方法一
算法步骤:
- 选取数组的第一个元素作为基准元素
pivot,初始化指针i和j分别指向数组的左端和右端。 - 从右向左扫描,找到第一个小于
pivot的元素,并与q[i]交换,然后i向右移动一位。 - 从左向右扫描,找到第一个大于
pivot的元素,并与q[j]交换,然后j向左移动一位。 - 重复步骤 2 和 3,直到
i和j重合。 - 此时
i和j所指的位置正好是pivot元素,递归处理左右两个子序列。
C++代码
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int x = l + r >> 1, i = l, j = r;
swap(q[l], q[x]);
int pivot = q[l];
while (i < j) {
while (i < j && q[j] > pivot) j--;
if (i < j) swap(q[i++], q[j]);
while (i < j && q[i] < pivot) i++;
if (i < j) swap(q[i], q[j--]);
}
quick_sort(q, l, i - 1);
quick_sort(q, i + 1, r);
}
方法二
算法步骤:
- 选择数组中间的元素作为基准元素
x,初始化指针i和j分别指向数组的左端减一和右端加一。 - 使用
do-while循环从左向右找到第一个大于等于x的元素,从右向左找到第一个小于等于x的元素。 - 如果
i小于j,则交换q[i]和q[j]。 - 递归处理左右两个子序列。
C++代码
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
方法三
算法步骤:
- 选择数组中间的元素作为基准元素
x,初始化指针i和j分别指向数组的左端和右端。 - 使用
while循环从左向右找到第一个大于等于x的元素,从右向左找到第一个小于等于x的元素。 - 如果
i小于等于j,则交换q[i]和q[j],并移动指针。 - 递归处理左右两个子序列。
C++代码
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int i = l, j = r, x = q[l + r >> 1];
while (i <= j) {
while (q[i] < x) i++;
while (q[j] > x) j--;
if (i <= j) swap(q[i++], q[j--]);
}
quick_sort(q, l, j);
quick_sort(q, i, r);
}