0

教科書からの宿題の質問「セクション9.6のqsort.cプログラムを変更して、low、high、およびmiddleが整数ではなく配列要素へのポインターになるようにします。分割関数は、整数ではなくポインターを返す必要があります。」

qsort.c コード:

#include <stdio.h>
#define N 10

void quicksort(int a[], int low, int high);

int split(int a[], int low, int high);

int main(void)

{

int a[N], i;

printf("Enter %d numbers to be sorted: :", N);

for (i=0; i<N; i++)

    scanf("%d", &a[i]);

    quicksort(a, 0, N - 1);

    printf("In sorted order: ");
    for (i=0; i<N; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

void quicksort(int a[], int low, int high)
{
    int middle;

    if (low >= high) return;
    middle = split(a, low, high);
    printf("Low");
    printf("%d", low);
    quicksort(a, low, middle - 1);
    quicksort(a, middle + 1, high);
}

int split(int a[], int low, int high)
{
    int part_element = a[low];

    for (;;) {
        while (low < high && part_element <= a[high])
            high--;
        if (low >= high) break;
        a[low++] = a[high];

        while (low < high && a[low] <= part_element)
            low++;
        if (low >= high) break;
        a[high--] = a[low];

    }

    a[high] = part_element;
    return high;
}

解決策への私の試み:

#include <stdio.h>

#define N 10

void quicksort(int a[], int *low, int *high);
int split(int a[], int *low, int *high);

int main(void)
{
int a[N], i;
int zero, nminus;
printf("Enter %d numbers to be sorted: :", N);
for (i=0; i<N; i++)
    scanf("%d", &a[i]);
    zero=0;
    nminus=N-1;
    quicksort(a, &zero, &nminus);

    printf("In sorted order: ");
    for (i=0; i<N; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

void quicksort(int a[], int *low, int *high)
{
    int *middle;
    int splitt;
    if (low >= high) return;
    splitt = split(a, low, high);
    middle = &splitt;

    quicksort(a, low, middle - 1);
    quicksort(a, middle + 1, high);
}

int split(int a[], int *low, int *high)
{
    int low1, high1;
    low1= *low;
    high1= *high;
    int part_element = a[low1];

    for (;;) {
        while (low1 < high1 && part_element <= a[high1])
            high1--;
        if (low1 >= high1) break;
        a[low1++] = a[high1];

        while (low1 < high1 && a[low1] <= part_element)
            low1++;
        if (low1 >= high1) break;
        a[high1--] = a[low1];

    }

    a[high1] = part_element;
    return high1;
}

私は c プログラミングが初めてで、このプログラムを正しく動作させる方法がわかりません。この試行は正常にデバッグされますが、ソートせずに入力を吐き出すだけです。どんな助けでも大歓迎です。

4

3 に答える 3

1

それは言います:

分割関数は、整数ではなくポインターを返す必要があります。

int split(int a[], int *low, int *high);

整数ではなくポインターを返します。

int *split(int a[], int *low, int *high);

于 2013-05-10T18:55:12.670 に答える
1

一番上をコピーして貼り付けると、実際に行う必要があるのは次の変更だけです。

高、低、または中を比較するたびに、 -- または ++ をそのままにして、そのように逆参照します。例えば:

 a[high1--] = a[low1];

に行く

 *(high--) = *low. 

次に、ポインタを高、低、中程度に渡すだけです。

于 2013-05-10T18:52:53.357 に答える
0

多分このように

#include <stdio.h>

#define N 10

void quicksort(int a[], int *low, int *high);
int* split(int a[], int *low, int *high);

int main(void)
{
    int a[N], i;
    printf("Enter %d numbers to be sorted: :", N);
    for (i=0; i<N; i++)
        scanf("%d", &a[i]);
    quicksort(a, &a[0], &a[N-1]);

    printf("In sorted order: ");
    for (i=0; i<N; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

void quicksort(int a[], int *low, int *high)
{
    int *middle;
    if (low >= high) return;
    middle = split(a, low, high);

    quicksort(a, low, middle - 1);
    quicksort(a, middle + 1, high);
}

int*  split(int a[], int *low, int *high)
{
    int part_element = *low;

    for (;;) {
        while (low < high && part_element <= *high)
            high--;
        if (low >= high) break;
        *low++ = *high;

        while (low < high && *low <= part_element)
            low++;
        if (low >= high) break;
        *high-- = *low;

    }

    *high = part_element;
    return high;
}

対応表

 when sizeof(int) is 4
 address | array a | index of array
 a(top)  |   a[0]  |        0
 a + 4   |   a[1]  |        1
 a + 8   |   a[2]  |        2
 ...

 &a[1] is (a + 4) : address of a[1]
 *(a+4) is a[1] : (a+4) is a + 1*sizeof(int), *(a+1) in c
于 2013-05-10T21:50:16.390 に答える