首页 文章

我的排序功能给出了意外的输出

提问于
浏览
1

我编写了一个通用的C语言程序,它给出了一系列数字,排序,偶数,按升序排列,奇数按降序排列,并将所有偶数放在数组的初始部分,然后是奇数 .

Example: 2, 5, 1, 0, 4, 7, 9, 3, -2, 10, 20, 15
Expect: -2, 0, 2, 4, 10, 20, 15, 9, 7, 5, 3, 1

需要六个功能 . 必须仅使用上述函数提供解决方案 . 不应声明全局变量 . 使用适当的数据类型,返回类型和函数参数 .

  • Input() - 将元素和值的总数作为用户的输入 . 将值存储在“input”数组中 .

  • SortEven() - 按升序对偶数进行排序,并将它们存储在名为“even”的数组中

  • SortOdd() - 按降序对奇数进行排序,并将它们存储在名为“odd”的数组中

  • Merge() - 将所有偶数放在数组的初始部分,名为“result”,然后是奇数 .

  • Display() - 显示“result”数组的内容 .

  • main() - 调用Input()模块开始执行 .

程序:

#include <stdio.h>

int main() {
    input();
}
int input() {
    int n;
    printf("Enter The Number Of Elements You Want To Enter : ");
    scanf("%d", &n);
    int a[n], i, ev = 0, od = 0;
    for (i = 0; i < n; i++) {
        printf("Enter Number : ");
        scanf("%d", &a[i]);
        if (a[i] % 2 == 0) {
            ev++;
        } else {
            od++;
        }
    }
    sorteven(a, ev, od, n);
}
int sorteven(int a[], int ev, int od, int n) {
    int i, j = 0, swap, even[ev];
    for (i = 0; i < n; i++) {
        if (a[i] % 2 == 0) {
            even[j] = a[i];
            j++;
        }
    }
    for (i = 0; i < ev - 1; i++) {
        for (j = 0; j < ev - i - 1; j++) {
            if (even[j] > even[j + 1]) {
                swap = even[j];
                even[j] = even[j + 1];
                even[j + 1] = swap;
            }
        }
    }
    sortodd(a, ev, od, n, even);
}
int sortodd(int a[], int ev, int od, int n, int even[]) {
    int i, k = 0, swap, odd[od], j;
    for (i = 0; i < n; i++) {
        if (a[i] % 2 != 0) {
            odd[k] = a[i];
            k++;
        }
    }
    for (i = 0; i < od - 1; i++) {
        for (j = 0; j < od - i - 1; j++) {
            if (odd[j] < odd[j + 1]) {
                swap = odd[j];
                odd[j] = odd[j + 1];
                odd[j + 1] = swap;
            }
        }
    }
    merge(a, ev, od, n, even, odd);
}
int merge(int a[], int ev, int od, int n, int even[], int odd[]) {
    int merge[n], i;
    for (i = 0; i < ev; i++) {
        merge[i] = even[i];
    }
    for (i = ev; i < n; i++) {
        merge[i] = odd[i];
    }
    display(merge, n);
}
int display(int merge[], int n) {
    int i;
    printf("OUTPUT : ");
    for (i = 0; i < n; i++) {
        printf(" %d ", merge[i]);
    }
}

1 回答

  • 2

    查看源代码时,问题位于 merge() 函数中 . sorteven()sortodd() 都很好地实现了,但是当合并两个子阵列时, for(i=ev;i<n;i++) 不正确 .

    要在 even[] 数组的末尾添加 odd[] 数组,请写入:

    int j;
    // point to the first item of odd[]
    for(i=ev,j=0;i<n;i++,j++)
    {
        merge[i]=odd[j];
    }
    

    代替:

    仅分配和定义奇数[0]到奇数[od-1] .

    for(i=ev;i<n;i++)
    {
        merge[i]=odd[i];
    }
    

    产出:

    { 2, 5, 1, 0, 4, 7, 9, 3, -2, 10, 20, 15 };
    

    是:

    OUTPUT :  -2  0  2  4  10  20  15  9  7  5  3  1
    

相关问题