原题链接:https://www.luogu.com.cn/problem/P1177
题意解读:数据量为100000,必须用小于等于N*logN复杂度的排序算法,可以直接用sort,更重要需要掌握快速排序的过程。
知识点:快速排序
设定数组q[n],l,r
第一步:确定分界点x
可以取q[l]、q[(l+r) / 2]、q[r]三种
第二步:调整区间
把<=x的数调整到左边区间,>=x的数调整到右边区间
第三步:递归处理
难点主要在第二步,有两种方法:
方法一:空间换时间
开两个数组a[],b[],遍历q[],将<=x的放到a数组,将>=x的放到b数组,然后依次遍历a、b数组把数填到q数组
方法二:头尾指针
定义两个下标i,j,指向数组头、尾,
q[i]如果<x,i一直++,直到遇到q[i]>=x
q[j]如果>x,j一直--,直到遇到q[j]<=x
然后swap(q[i], q[j])
重复以上过程,直到i、j相遇。
快速排序的代码有多种方式,下面给出一种比较简化的版本。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N];
int n;
void quicksort(int l, int r)
{
if(l >= r) return;
int x = a[(l + r) / 2];
int i = l - 1, j = r + 1;
while(i < j)
{
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if(i < j) swap(a[i], a[j]);
}
quicksort(l, j);
quicksort(j + 1, r);
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
//sort(a + 1, a + n + 1);
quicksort(1, n);
for(int i = 1; i <= n; i++)
{
if(i > 1) cout << " ";
cout << a[i];
}
return 0;
}
标签:int,洛谷题,quicksort,P1177,while,数组,排序 From: https://www.cnblogs.com/jcwy/p/17990943