每天一题 · Day1 · 快速排序[785]

Posted 毅毅的点滴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一题 · Day1 · 快速排序[785]相关的知识,希望对你有一定的参考价值。

**题目描述**给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。>> 输入格式* 输入共两行,第一行包含整数 n。* 第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。>> 输出格式* 输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1≤n≤100000

样例

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

分析

使用快排方法:
1.选取:一个比较值
2.整理:数列中小于这个数放在这个数的左侧,将数列中大于这个数放在这个数的右侧
3.进行这个数的左右两个子部分进行快排操作。

#include <iostream>using namespace std;
const int N = 1e5; //这个是输入数据的限制值int n;int q[N]; // 将大量数组开辟在全局(内存中的static区域),防止栈过爆
void quick_sort(int q[], int L, int R){ if(L >= R) return; //1.边界条件判断
// 2.选取一个比较值 int x = q[(L + R)>>1];
int i = L - 1; //这里的i,j要选取 L - 1和R + 1是因为在下面的while()比较的顺序,使i,j游标落在比较的 int j = R + 1; //数字上
while(i < j){ while(q[++i] < x); // 找到左侧的第一个大于比较值的游标位置 while(q[--j] > x); // 找到右侧的第一个小于比较值的游标位置 if(i < j) swap(q[i] , q[j]); // 如果两个i,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;}


以上是关于每天一题 · Day1 · 快速排序[785]的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode每天一题Insertion Sort List(使用插入法对链表进行排序)

每天一题之001

Acwing785.快速排序

AcWing 785. 快速排序

AcWing 785. 快速排序

快速排序模板 (ACwing.785)