传送门:P1177 【模板】快速排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
传统快速排序:
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void qsort(int a[], int left, int right)
{
if (left >= right)
return;
int i = left, j = right;
while (i < j)
{
while (j > i && a[j] >= a[left])
j--;
while (i < j && a[i] <= a[left])
i++;
swap(a[i], (i == j) ? a[left] : a[j]); //i和j相遇则与枢轴元素交换,否则a[i]与a[j]交换
}
quickSort(a, left, i-1);
quickSort(a, j+1, right);
}
随机值快速排序:
#include<iostream>
#include<algorithm>
using namespace std;
int b[100001];
void swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
void qsort(int a[],int l,int r)
{
if(l>=r) return;
int i=l,j=r,pivot=rand()%(r-l+1)+l,mid=a[pivot];
swap(a[l],a[pivot]);
while(i<j){
while(i<j&&a[j]>=mid) j--;
while(i<j&&a[i]<=mid) i++;
swap(a[i],i==j?a[l]:a[j]);
}
qsort(a,l,i-1);
qsort(a,i+1,r);
}
int main()
{
int n,a[100001];
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
qsort(a,1,n);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
}