jor蛋 @ 2021-08-07 14:55:04
为什么我这样写不行,虽然可能会慢一点,但也不至于一个点都过不了吧?
#include<stdio.h>
int a[100000010];
int quick_sort(int q[],int l,int r){
if(l>=r) return 0;
int i=l-1, j=r+1, x=q[(l+r)/2];
while(i<j){
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j){
int t=q[i];
q[i]=q[j];
q[j]=t;
}
}
quick_sort(a,l,j); quick_sort(a,j+1,r);
}
int main(){
int n,m,i,sum=0,k;
scanf("%d%d",&m,&k);
for(i=1;i<=m;i++)
scanf("%d",&a[i]);
quick_sort(a,1,m);
k=k+1;
for(i=1;i<=m;i++){
if(a[i]!=a[i-1]){
sum++;
}
// printf("%d\n",sum);
if(sum==k){
printf("%d\n",a[i]);
break;
}
}
}
by vectorli1 @ 2021-08-07 14:59:09
快排写错了
by vectorli1 @ 2021-08-07 15:02:59
//int quick_sort(int q[],int l,int r){
void quick_sort(int q[],int l,int r){
//if(l>=r) return 0;
if(l>=r) return;
//int i=l-1, j=r+1, x=q[(l+r)/2];
int i=l, j=r, x=q[rand()%(r-l+1)+l];
//while(i<j){
while(i<=j){
do i++; while(q[i]<x);
do j--; while(q[j]>x);
//if(i<j){
if(i<=j)
int t=q[i];
q[i]=q[j];
q[j]=t;
}
}
//quick_sort(a,l,j);
//quick_sort(a,j+1,r);
quick_sort(q, l, j);
quick_sort(q, i, r);
}
by 2simon2008 @ 2021-08-07 15:04:19
if(i<j){
int t=q[i];
q[i]=q[j];
q[j]=t;
}
这个if语句要改为
if(i<j){
int t=q[i];
q[i]=q[j];
q[j]=t;
i++;
j--;
}
by 2simon2008 @ 2021-08-07 15:07:37
@VecTorLi 不一定要rand吧
by jor蛋 @ 2021-08-07 15:09:16
@VecTorLi 用return我编译不出来。
by vectorli1 @ 2021-08-07 15:10:22
如果不是随机选择基准数,有可能被特殊数据卡掉(书上好像是这么说的)
by jor蛋 @ 2021-08-07 15:11:11
而且我在P1177用的就是这样写的快排,过了的
by vectorli1 @ 2021-08-07 15:11:53
@jor蛋 我这里是可以编译的
by jor蛋 @ 2021-08-07 15:12:33
@VecTorLi 我用c语音的喂
by vectorli1 @ 2021-08-07 15:13:25
还有你数组开的太大了, 只用开 5000000 + 5
就行了