快速排序
快速排序是一种高效且应用广泛的排序算法,由C. A. R. Hoare在1962年提出,它采用分治策略,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小,之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
快速排序的基本步骤包括:
1.选择基准:在待排序列中,按照某种方式挑出一个元素,作为“基准”;
2.分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大;
3.递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。
具体代码如下:建议牢牢记住
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int x = q[(l + r) / 2];
// 初始化双指针i和j,i从左侧开始,j从右侧开始,注意i和j都往外扩一个,避免边界错误
int i = l - 1;
int j = r + 1;
// 使用while循环进行元素的交换,直到i和j相遇
while (i < j)
{
// 从左向右扫描,找到第一个大于等于基准点x的元素
do i++; while (q[i] < x);
// 从右向左扫描,找到第一个小于等于基准点x的元素
do j--; while (q[j] > x);
// 如果i小于j,说明找到了一对可以交换的元素
if (i < j) swap(q[i], q[j]);
}
// 递归地对子数组进行快速排序,注意递归的边界是j,因为j已经移动到了第一个大于x的元素位置
quick_sort(q, l, j); //j
// 对于j+1到r的子数组,同样递归地进行快速排序
quick_sort(q, j + 1, r);
}
// 调用方法:quick_sort(q, 0, q.size() - 1);
背就够了!注意递归的边界为j,而不是i