快速排序及acwing快排模板

本文主要介绍快速排序算法,包括其发明背景。阐述了算法思想,如寻找标记、交换元素、分治和递归。还给出了算法题目,要求对给定整数数列排序并输出结果,同时展示了部分算法模板代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这是我第一次写博客,一是为了记录自己的学习,做好笔记,二是希望可以分享有用的东西可以帮到大家,如果有不完善的地方请多指教。

快速排序是由C.A.R Hoare在1960年发明的,谨以此篇向Hoare大佬致敬!

算法思想

  1. 寻找标记:从一连串无序的元素中找到一个标记x
  2. 交换: 将小于等于x的元素都换到数组左边,将大于等于x的数都换到数组右边
  3. 分治:将此数组分为两个部分,使得左半边的元素都不大于x,右半边的数字都不小于x
  4. 递归:对左半边数组进行快排,对右半边数组进行快排。最后使得每一个分组中只有一个或没有元素。

算法题目

给定你一个长度为n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式
输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在1~10^9范围内),表示整个数列。

输出格式
输出共一行,包含 n 个整数,表示排好序的数列。

数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

算法模板

#include

using namespace std;

const int N = 100010;

int v[N];

void quick_sort(int v[], int left, int right)
{
if (left >= right)
return; // 如果当前区间内的元素不超过一个,则不做任何操作,返回

int x = v[(left + right) >> 1];
int i = left-1;
int j = right+1;

while (i < j){
    do i++; while(v[i] < x);  //保证在i左边没有不小于x的数
    do j--; while(v[j] > x); // 保证在j右边没有不大于x的数
    
    if(i<j)
        swap(v[i], v[j]);
}

quick_sort(v, left, j);  // 分治递归
quick_sort(v, j+1, right);

}
int main()
{
int n;
scanf("%d", &n);

for(int i = 0; i < n; i++)
    scanf("%d",&v[i]);
    
quick_sort(v, 0, n-1);

for (int i = 0; i < n; i++)
    printf("%d ", v[i]);
    
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值