最基本的快速排序的代码如下:
#include<iostream>
using namespace std;
int a[1000];
void quicksort (int left,int right)
{
int mid=a[(left+right)/2];
int l=left,r=right;
while(l<=r)
{
while(a[l]<mid) l++;
while(a[r]>mid) r--;
if(l<=r){
swap(a[l],a[r]);
l++;
r--;
}
if(left<r) quicksort(left,r);
if(l<right) quicksort(l,right);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
quicksort(1,n);
}
如果TLE就把cin和cout换成scanf和printf
拓展
由于每次quicksort以后都会使得一个数列分为三个部分即<mid、=mid、>mid。如果要找到一个第k大或者第k小的数,则只要判断k在哪个部分,相应的只要排序k所在的部分即可,这样可以大大的节省时间。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[5000005];
int k;
void quicksort(int left,int right)
{
int mid=a[(left+right)/2];
int l=left,r=right;
while(l<=r){
while(a[l]<mid) l++;
while(a[r]>mid) r--;
if(l<=r){
swap(a[l],a[r]);
l++;
r--;
}
}
if(k<=r) quicksort(left,r);
else if(k>=l) quicksort(l,right);
else{
printf("%d",a[r+1]);
exit(0);
}
}
int main()
{
int n;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
quicksort(0,n-1);
}
这里用了scanf和printf,if不用,部分题目会TLE