C中的计数排序只能排序前4个数字

时间:2017-11-15 19:33:51

标签: c arrays sorting

我正在为一个C程序工作,使用计数排序来排序数字,这是我的代码,我使用外部txt文件进行输入。并且库arrayio.h是给定的输入代码。

#include <stdio.h>
#include <stdlib.h>
#include "arrayio.h"

int MAX_LAENGE = 1000;
int MAX_VALUE = 100;
int i,j,k;

void count_sort_calculate_counts(int input_array[], int len, int count_array[]) {
    for (i=0; i<len;i++) {
        count_array[i] = 0;
    }
    for (j=0; j<len;j++) {
        count_array[input_array[j]] = count_array[input_array[j]] + 1;
    }
}

void count_sort_write_output_array(int output_array[], int len, int count_array[]) {
    k=0;
    for (j=0;j<len;j++) {
        for (i=0; i<count_array[j]; i++) {
            output_array[k] = j;
            k = k + 1;
        }
    }
}

int main(int argc, char *argv[]) {
    if (argc < 2){
        printf("Aufruf: %s <Dateiname>\n", argv[0]);
        printf("Beispiel: %s zahlen.txt\n", argv[0]);
        exit(1);
    }
    char *filename = argv[1];

    int input_array[MAX_LAENGE];
    int len = read_array_from_file(input_array, MAX_LAENGE, filename);

    printf("Unsortiertes Array:");
    print_array(input_array, len);

    int count_array[MAX_LAENGE];
    int output_array[MAX_LAENGE];
    count_sort_calculate_counts(input_array, len, count_array);
    count_sort_write_output_array(output_array, len, count_array);

    printf("Sortiertes Array:");
    print_array(output_array, len);
    return 0;
}

我的问题是,当我运行此程序时,它只返回前4个数字。 例如,当我输入:

90 38 42 34 8 0 77 1 84 5 25 72 44 42 90 63 23

它返回:

0 1 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0

1 个答案:

答案 0 :(得分:1)

错误发生在将计数分配回输出数组的代码中。在达到原始数组的长度时结束计数的迭代,而当你达到最大值时应该结束它:

void count_sort_write_output_array(int output_array[], int len, int count_array[]){
    k=0;
    for (j=0;j<MAX_LAENGE;j++)
    {
        for (i=0; i<count_array[j]; i++)
        {
            output_array[k++] = j;
        }
    }
}

Demo.

为风格赚取一些积分&#34;考虑将计数数组隐藏在单个排序函数中,该函数计算计数并将值分配回输出数组。毕竟,计数是一个中间结果,应该对您的代码用户不感兴趣,因此您不应该要求排序功能的用户分配它。