欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力
对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

专栏:
文章概述:ACM算法 ——快排
关键词:ACM 快排
本文目录:
快速排序(quick sort)
是一种基于分治策略的排序算法,运行高效,应用广泛。
原理
快速排序的核心操作是“哨兵划分”,其目标是:选择数组中的某个元素作为“基准数”,将所有小于基准数的元素移到其左侧,而大于基准数的元素移到其右侧。具体来说,哨兵划分的流程如图 所示。

步骤
- 确定分界点X:
- 调整区间:
- 选取数组最左端元素作为基准数,初始化两个指针
i和j分别指向数组的两端。 - 设置一个循环,在每轮中使用
i(j)分别寻找第一个比基准数大(小)的元素,然后交换这两个元 素。 - 循环执行步骤
2.,直到i和j相遇时停止,最后将基准数交换至两个子数组的分界线。
- 递归处理左右两端
示例:
C语言版
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
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);
}
int main(void)
{
int n;
scanf("%d", &n);
int *q = (int *)malloc(n * sizeof(int));
if (q == NULL)
{
fprintf(stderr, "Memory allocation failed.\n");
return 1;
}
for (int i = 0; i < n; i++)
{
scanf("%d", &q[i]);
}
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++)
{
printf("%d ", q[i]);
}
printf("\n");
free(q);
return 0;
}
C++版
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
const int N = 100002;
int nums[N];
void quick_sort(int q[], int l, int r) {
if (l >= r) {
return;
}
int x = q[ l+r >> 1];

最低0.47元/天 解锁文章
2071

被折叠的 条评论
为什么被折叠?



