虽然用另一种写法AC了,但还是想问下

P1923 【深基9.例4】求第 k 小的数

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 就行了


| 下一页