0

我得到了一个 C 程序,它在具有 int 值的数组上实现快速排序。我需要将其转换为一个程序,该程序将在具有双 * 值的数组上实现快速排序。我认为我只需要将“int”声明更改为“double*”,但由于某种原因,当我测试具有除整数以外的其他值的数组时,程序不再工作。

有人可以帮忙吗?我真的对 C 编程几乎一无所知,也不知道如何继续。这是“int”程序:

void quicksort(int a[], int n)
{
    if (n <= 1) return;
    int p = a[n/2];
    int b[n], c[n];
    int i, j = 0, k = 0;
    for (i=0; i < n; i++) {
        if (i == n/2) continue;
        if ( a[i] <= p) b[j++] = a[i];
        else            c[k++] = a[i];
    }
    quicksort(b,j);
    quicksort(c,k);
    for (i=0; i<j; i++) a[i] =b[i];
    a[j] = p;
    for (i= 0; i<k; i++) a[j+1+i] =c[i];
}


int main(void) {
    int i;
    /* das Array zum Sortieren */
    int test_array[] = { 5, 2, 7, 9, 6, 4, 3, 8, 1 };
    int N = sizeof(test_array)/sizeof(int);

    quicksort(test_array,  N);

    for(i = 0; i < N; i++)
        printf("%d ", test_array[i]);
    printf("\n");

    return 0;
}
4

2 回答 2

2

当您int用指针替换 s 时double,您需要更改比较 - 比较指向的值,而不是指针本身。

于 2013-11-10T19:43:54.347 回答
-1
void quicksort(double a[], int n) {
    if (n <= 1) return;
    double p = a[n/2];
    double b[n], c[n];
    int i, j = 0, k = 0;
    for (i=0; i < n; i++) {
        if (i == n/2) continue;
        if ( a[i] <= p) b[j++] = a[i];
        else            c[k++] = a[i];
    }
    quicksort(b,j);
    quicksort(c,k);
    for (i=0; i<j; i++) a[i] =b[i];
    a[j] = p;
    for (i= 0; i<k; i++) a[j+1+i] =c[i]; }


int main(void) {
    int i;
    /* das Array zum Sortieren */
    double test_array[] = { 5.1, 2.0, 7.8, 9.5, 6.0, 4.7, 3.6, 8.7, 1.1 };
    int N = sizeof(test_array)/sizeof(double);

    for(i = 0; i < N; i++)
        printf("%f ", test_array[i]);
    printf("\n");


    quicksort(test_array,  N);

    for(i = 0; i < N; i++)
        printf("%f ", test_array[i]);
    printf("\n");

    return 0; }

效果很好,只是将一些 int 更改为 double。如果你想学习用 C 编写代码,你最好买一本好书。指针是 C/C++ 的基础知识!!检查此以获取有关快速排序的更好信息:http: //de.wikipedia.org/wiki/Quicksort

制造

于 2013-11-10T20:03:09.817 回答