题目链接:点击查看
题目描述:
给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。
输入输出
输入
5
3 1 2 4 5
输出
1 2 3 4 5
题目分析 :
对于快速排序,我们将其分成以下三步走。第一,确定分界点(左边界,右边界,中点,随机)。第二,调整范围(比基准值小的在其右侧,比基准值大的在其左侧)。第三,递归处理左右两边(运用递归对区间的左右两边进行排序)。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 1e5 + 7;
int n;
int arr[N];
void quick_sort(int *arr, int l, int r) {
if (l >= r)
return ;
int i = l - 1, j = r + 1,k = arr[l + r >> 1];//选取中间点为基准点 i , j 用于模拟指向数组左右两端的双指针
while (i < j) {//进行范围调整
do i ++ ; while (arr[i] < k);
do j -- ; while (arr[j] > k);
if(i < j)
swap(arr[i], arr[j]);
}
quick_sort(arr, l, j);//递归处理左右两端
quick_sort(arr, j + 1, r);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
scanf("%d", &arr[i]);
quick_sort(arr, 0, n - 1);
for (int i = 0; i < n; i ++ )
printf("%d ", arr[i]);
return 0;
}
在此我们给出快排模板
void quick_sort(int *arr, int l,int r) {
if(l>=r)
return ;
int i = l - 1, j = r + 1,k = arr[l + r >> 1];
while (i < j) {
do i++; while (arr[i] < k);
do j--; while (arr[j] > k);
if (i < j)
swap(arr[i], arr[j]);
}
quick_sort(arr, l, j);
quick_sort(arr, j + 1, r);
}