初级数据结构与算法模板
本人蒟蒻一枚,希望和本站对c语言感兴趣的小伙伴共同学习。
接下来就让我们开始我们第一篇文章吧。
快速排序
快速排序这个东西,刷题遇到的不太多,几乎都是我们直接sort。
但是这个手写的快速排序,面试官以及笔试时候出现次数很多,所以我们在这里给大家带来这篇快速排序的代码模板。
首先我们先看一下这道题洛谷P1177
题目描述
利用快速排序算法将读入的 NN 个数从小到大排序后输出。
快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓)。
代码具体粘贴如下
具体代码
数组q[],左边界l,右边界r,值x,i左侧指针,j右侧指针
1.确定分界点:q[l],q[r],q[(l+r)/2],随机 都是可以的
2.调整区间:使得左边<= x,右边>= x
3.递归实现左右两段
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
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 ()
{
scanf ("%d", &n);
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]);
}
return 0;
}
解释一下这里为什么用do while 而不是while ,当然每个人的写法不同,用while 也是可以,只是个人认为do while比较省事(就是懒,能省则省哈哈)无论如何都执行一次的特性,所以使用了do while,但是无论黑猫白猫,抓到老鼠就是好猫。
最后还是感谢大家耐心观看,如果对您有一点帮助的话,请给点个赞吧。