声明:这是从我的洛谷博客里的一篇题解里的知识点复制过来的。
一、算法原理
用a数组表示要排序的数组。
第一步:选择一个数x,将的数移到a数组的左边或右边;将
的数移到a数组的右边或左边。
第二步:a数组的左边和右边分别进行排序。两边的排序都重复第一步的操作。
第三步:重复前两步的操作。
第四步:两边都排好后,再把全部排一下。
第五步:输出。
二、代码
例题:洛谷P1177
#include<bit/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int N,a[maxn];
viod quicksort(int left,int right){
if(left>=right)return;
int key=left+1+(int)rand()%(right-left);
swap(a[key],a[left]);
key=left;
int i=left+1,j=right;
while(i<j){
while(a[i]<a[key]&&i<j)i++;//在数组左边,找比分界值大的数
while(a[j]>a[key]&&i<j)j--;//在数组右边,找比分界值小的数
if(i>=j)break;
swap(a[i],a[j]);//交换
i++;
j--;
}
if(a[i]>a[key]){//排序
swap(a[i-1],a[key]);
key=i-1;
}else{
swap(a[i],a[key]);
key=i;
}
quicksort(left,key-1);
quicksort(key+1,right);
}
int mian(){
srand((unsigned)time(NULL));
int i;
scanf("%d",&N);
for(i=1;i<=N;i++)scanf("%d",&a[i]);//输入
quicksort(1,N);
for(i=1;i<=N;i++)printf("%d ",a[i]);//输出
cout<<endl;
return 0;
}
这代码防抄袭,如果直接复制会CE。