-1

私は、プログラミング クラスの課題の一部として、再帰的なクイック ソートのコードを C で作成しています。すべてを書きましたが、コンパイルすると次のエラーが発生します。

- 1>quick_sort.c(32): error C2143: syntax error : missing ';' before 'type'
- 1>quick_sort.c(33): error C2143: syntax error : missing ';' before 'type'
- 1>quick_sort.c(35): error C2065: 'right' : undeclared identifier
- 1>quick_sort.c(36): error C2065: 'pivot' : undeclared identifier
- 1>quick_sort.c(39): error C2065: 'right' : undeclared identifier
- 1>quick_sort.c(39): error C2065: 'pivot' : undeclared identifier
- 1>quick_sort.c(40): error C2065: 'right' : undeclared identifier
- 1>quick_sort.c(42): error C2065: 'right' : undeclared identifier

これが私のコードです:

/*This code will take input for 10 integers given by the user
into an array and then sort them with a recursive quicksort
function and then print the updated array. */

#include <stdio.h>
#define ARRSIZE 10

void partition (int arr[],int size);
void val_swap (int a, int b);

int main (void){
    int arr[ARRSIZE], left, right, i = 0;

    while(i<ARRSIZE){
        printf("\nInteger value %d:", i+1);
        scanf("%d", &arr[i]);
        i++;
    }
    left = 0;
    right = ARRSIZE - 1;

    partition(arr, right-left, left);

    printf("\nThis is your updated array:");
    printf("\n{");
    for(i=0; i<ARRSIZE; i++){
        printf("%d,", arr[i]);
    }
    printf("}");
    return 0;
}    

void partition (int arr[],int size, int left){
    if(size < 2){
        return;
    }
    int pivot = size/2;
    int left = 0, right = size;

    while(left < right){
        while(arr[left] < arr[pivot]){
            left++;
        }
        while(arr[right] > arr[pivot]){
            right++;
        }
        val_swap(arr[left], arr[right]);
    }

    partition(arr,left, 0);
    partition(arr, size-left, left+1);
}    

void val_swap (int a, int b){

    int temp = b;
    b = a;
    a = temp;
}

誰か提案はありますか?

編集:わかりました、すべてのエラーを修正しました。それらの多くは、ビジュアルスタジオが愚かだったことが原因でした。私のコードは、10から始まり1までカウントダウンする入力として1〜10の数字を入力したときのように、機能するようになりました。ただし、より複雑な数値を指定すると、配列の約半分しか正しく並べ替えられませんでした。

これが私の更新されたコードです:

/*This code will take input for 10 integers given by the user
into an array and then sort them with a recursive quicksort
function and then print the updated array. */

#include <stdio.h>
#define ARRSIZE 10

void partition (int arr[],int size, int left);
void val_swap (int *a, int *b);

int main (void){
    int arr[ARRSIZE], left, right, i = 0;

    while(i<ARRSIZE){
        printf("\nInteger value %d:", i+1);
        scanf("%d", &arr[i]);
        i++;
    }
    left = 0;
    right = ARRSIZE - 1;

    partition(arr, right-left, left);

    printf("\nThis is your updated array:");
    printf("\n{");
    for(i=0; i<ARRSIZE; i++){
        printf("%d,", arr[i]);
    }
    printf("}");
}

void partition (int arr[],int size, int left){
    int pivot, right;
    pivot = size/2;
    right = size;

    if(size < 2){
        return;
    }

    while(left < right){
        while(arr[left] < arr[pivot]){
            left++;
        }
        while(arr[right] > arr[pivot]){
            right--;
        }
        val_swap(&arr[left], &arr[right]);
    }

    partition(arr,left, 0);
    partition(arr, size-left, left+1);
}

void val_swap (int *a, int *b){

    int temp = *b;
    *b = *a;
    *a = temp;
}

他に提案はありますか?

4

3 に答える 3

1

left を渡してから、left を再宣言しようとします。

私はあなたが欲しいと思うint right = size; 注、これは単なる構文のアドバイスであり、これがあなたのqsを機能させるかどうかではありません:)

于 2013-02-18T03:55:59.247 に答える
0

これにより、問題の一部が修正されます。

void val_swap (int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
于 2013-02-18T04:09:32.210 に答える
0

スワップ関数は次のようになります

void val_swap (int* a, int* b){

    int temp = *b;
    *b = *a;
    *a = temp;
}

関数内のこのループは間違っています

 while(arr[right] > arr[pivot]){
            right++;
        }

arr[right]最後の要素です。インクリメントright++することで、無効な要素にアクセスしています。以下のように変更しました。テストしてください

while(arr[right] > arr[pivot]){
    right--;
}

leftまた、関数内の変数の再宣言をpartition削除する必要があります

于 2013-02-18T04:05:25.103 に答える