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

时间:2016-12-04 13:21:56

标签: c arrays function sorting

我编写了一个广义的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

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

  1. Input() - 将元素和值的总数作为用户的输入。将值存储在“input”数组中。
  2. SortEven() - 按升序对偶数进行排序,并将它们存储在名为“偶数”的数组中
  3. SortOdd() - 按降序对奇数进行排序,并将它们存储在名为“odd”的数组中
  4. Merge() - 将所有偶数放在名为“result”的数组的初始部分,然后是奇数。
  5. Display() - 显示“result”数组的内容。
  6. main() - 调用Input()模块开始执行。
  7. 程序:

    #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 个答案:

答案 0 :(得分:2)

查看源代码时,问题出在merge()函数中。 sorteven()sortodd()都得到了很好的实现,但在合并两个子数组时,for(i=ev;i<n;i++)都不正确。

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

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

而不是:

  

仅分配和定义odd[0]odd[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