快速排序
快速排序
给定你一个长度为 n
的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
前摘提要
首先我先来介绍一下快速排序算法,它被誉为最快排序算法,可以快到nlogn
级别,而且在c++
中已经有了相关的函数sort()
,所以在算法竞赛中它的模板其实也没有那么重要(毕竟算法竞赛是要赶时间的嘛,太慢了题都搞不定),但是这里还是要介绍一下这个算法的思想。
算法思想
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int x = q[l]; int i = l - 1, j = 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);
}
它主要是采用了双指针的思想来解题的,也就是说我们创建两个指针(其实不是真要创建两个指针,实际上是两个变量l
,r
) 一个呢,从左到右来进行,一个从右到左来进行,我们再设立一个中间量,就第三个数了
我们以示例来讲,假设l
在左边,r
在右边,我们要从小到大来排序,先看l
,它指向了第一个数3,3比2大,好l
停下来,让r
走,r
走啊走,走到第四位时大于2,走到第三位时相等了,此时呢我们发现l
所指的数3是大于r
所指的数的,我们交换一下l
和r
的数字位置,此时排序变成了 2 1 3 4 5,我们再进行一次快排
新的循环
此时的排序是2 1 3,我们还是取中间的量1,l
所指的数刚好比1大,停下来,r
指的数比1小,再退一个,r
现在指的数就是1了,现在l
左边的数是严格小于的,r
右边的数是严格大于的,交换两数后,变成1 2 3了,我们再进入一次快排
最后的循环
我们发现两个循环1 2 3和4 5是严格从小到大的,这时候我们就可以返回去输出了,这样的算法复杂度是最快的
输出答案和程序书写建议
下面是定义变量,函数应用和输出变量的写法,谢谢观看@*@!
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 1e6 + 10;
int q[N], n;
int main()
{
scanf_s("%d", &n);
for (int i = 0; i < n; i++)
{
scanf_s("%d", &q[i]);
}
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++)
{
printf("%d ", q[i]);
}
return 0;
}
引入
—acwing算法基础课 (yxc主讲)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 浮云世事改, 过月此心明!