0

クイックソートを実装しましたが、このコードでセグメンテーション違反が発生しています。

#include<stdio.h>
#include<stdlib.h>
void Quick_Sort(int *a,int p,int r);
int partition(int *a,int p,int r);
int main(){
    int testcase,num,search;
    int i,j,*array;
    scanf("%d",&testcase);
    for(i=0;i<testcase;i++){
        scanf("%d",&num);
        array=malloc(sizeof(int)*num);
        for(j=0;j<num;j++){
            scanf("%d",(array+j));
        }
        Quick_Sort(array,0,num-1);
        scanf("%d",&search);
        /*for(j=0;j<num;j++){
            if(search==*(array+j)){
                printf("%d\n",j+1 );
                break;
            }

        }*/
    }
    for(i=0;*(array+i)!='\0';++i){
        printf("%d ",*(array+i));
    }
}
void Quick_Sort(int *a,int p,int r){
    int q;
    if(p<r){
        q=partition(a,p,r);
        Quick_Sort(a,p,q);
        Quick_Sort(a,q+1,r);
    }
}
int partition(int *a,int p,int r){
    int i,j,x,temp;
    i=p-1;
    j=r+1;
    x=*(a+p);
    while(1){
        do{
        j=j-1;
    }
    while(x<=(*(a+j)));

    do{
        i=i+1;
    }
    while(x>=(*(a+i)));

    if(i<j){
        temp=*(a+i);
        *(a+i)=*(a+j);
        *(a+j)=temp;
    }else{
        return j;
    }
}
4

2 に答える 2

0

コメントで指摘されているように*(array + i) != '\0'、印刷ループのループ終了テストはエラーです。 array通常の整数を保持し、C も'\0'整数 0 であると見なします。これは、すべての文字リテラル値を整数と見なし、比較は正当ですが、これは (うまくいけば) 任意の値を持つ可能性のある整数の並べ替えられた配列であるため (負の値と 0 を含む) テスト データに複数の 0 があるか、この場合はテスト データに 0 がない可能性が高いです。このような場合にこのコードが何をするかを理解すれば、エラーを理解できるはずです。

于 2013-11-01T14:20:58.430 に答える