前言
此系列博客为博主在AcWing算法基础课的学习笔记,不足之处欢迎批评指正,本文为快速排序。
一、快速排序模板
//这里为需要背诵的部分,要求:给一个相关题目,能快速写出该模板并调试通过,后续大部分模板也一样。
//快速排序
void quick_sort1(int q[], int l, int r)
{
//边界不满足左边小,直接返回
if (l >= r) return;
//第一步,确定边界
//tips1:由于i和j都是先自减或自增后判断,初始时i、j往边界两端扩一步
int i = l - 1, j = r + 1, x = q[l + r >> 1];
//第二步,划分区间,使得一边小于x,一边大于x;
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
//第三步,递归处理两边
quick_sort1(q, l, j), quick_sort1(q, j + 1, r);
}
二、快速排序模板题
1.题目要求
给定你一个长度为 n 的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
2.读入数据
代码如下(示例):
#include <iostream>
//平时练习可以适当熟悉使用各种库,实战面试可以再用<bits/stdc++.h>
//#include <bits/stdc++.h>
using namespace std;
const int N = 100010;//定义const变量N,习惯性根据题目数据范围+10
int q[N];//函数体外初始化数组全为0
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() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
//tips1:使用scanf而不用cin是为了在数据量较大的时候提高读写速度
scanf("%d", &q[i]);
}
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", q[i]);
}
return 0;
}
总结
具体内容见代码注释,补充内容如下:
1、C++中也可以直接用sort函数来实现排序,即sort(q, q+n),我记得是需要引入algorithm库,但本文意不在此;
2、若要实现从大到小排序,只需要互换模板中do…while语句中的判断条件即可。