#include<stdio.h>
void qsort(int head,int tail,int arr[]){
if(head>=tail){
return;
}
int i=head,j=tail,mid=arr[(head+tail)/2];
while(i<=j){
while(arr[i]<mid){
i++;
}
while(arr[j]>mid){
j--;
}
if(i<=j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
j--;
}
}
qsort(head,j,arr);
qsort(i,tail,arr);
}
int main(){
int n,num[1000000]={};
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
qsort(0,n-1,num);
for(int j=0;j<n;j++){
printf("%d ",num[j]);
}
return 0;
}
我就奇了怪了为什么我这个代码就能过所有的点,然而我重新写了一个快速排序(见下)就又不行了...有人能解释一下原理吗...
#include<stdio.h>
#include<stdlib.h>
void qs(int *a,int p,int r){
if(p>=r){
return;
}
int temp,i=p-1,piv=rand()%(r-p+1)+p;
temp=a[piv];
a[piv]=a[r];
a[r]=temp;
for(int j=p;j<r;j++){
if(a[j]<=a[r]){
i++;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
temp=a[i+1];
a[i+1]=a[r];
a[r]=temp;
qs(a,p,i);
qs(a,i+2,r);
}
int main(){
int n,arr[1000000]={};
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
qs(arr,0,n-1);
for(int i=0;i<n;i++){
printf("%d",arr[i]);
if(i!=n-1){
printf(" ");
}else{
printf("\n");
}
}
return 0;
}