前言
这是我第一次写博客,一是为了记录自己的学习,做好笔记,二是希望可以分享有用的东西可以帮到大家,如果有不完善的地方请多指教。
快速排序是由C.A.R Hoare在1960年发明的,谨以此篇向Hoare大佬致敬!
算法思想
- 寻找标记:从一连串无序的元素中找到一个标记x
- 交换: 将小于等于x的元素都换到数组左边,将大于等于x的数都换到数组右边
- 分治:将此数组分为两个部分,使得左半边的元素都不大于x,右半边的数字都不小于x
- 递归:对左半边数组进行快排,对右半边数组进行快排。最后使得每一个分组中只有一个或没有元素。
算法题目
给定你一个长度为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;
}