查找已排序数组的

时间:2016-04-29 02:07:30

标签: c

我希望得到一些关于如何在C中正确找到排序数组模式的输入。这就是我正在使用的内容。首先,我的freqDistrib功能:

void freqDistrib(int t[], int num) {
    int i, j, x;
    static int f[SIZE];

    printf("\n\n");
    printf("Part C:\n");
    printf(" %-5s %-16s\n", "score", "frequency");
    printf(" %-5s %-16s\n", "-----", "---------");

    for (i = 1; i < num; i++) {
        x = t[i];
        j = i - 1;
        while (j >= 0 && x > t[j]) {
            t[j + 1] = t[j];
            j = j - 1;
        }
        t[j + 1] = x;
    } // sorts input in descending order

    for (i = 0; i < num; i++) {
        ++f[t[i]];
        if (t[i] != t[i + 1])
            printf(" %3d %7d\n", t[i], f[t[i]]);
    } // finds the frequency of each input and prints
}

和我的模式功能:

void modeScore(int t[], int num) {
    int i, j, max, mode;
    int f[SIZE];

    for (i = 0; i < num; i++) {
        f[t[i]]++;
    }
    mode = 0;
    max = 0;
    for (j = 0; j < num; j++) {
        if (f[j] > max) {
            max = f[j];
            mode = j;
        }

    }

    printf("\n\n");
    printf("Part F:\n");
    printf("%3d is mode\n", mode);
}

立即输出:

  

0是模式

我意识到我需要将当前频率计数与最大值进行比较,如果它高于设定值则等于最大值。我不能为我的生活弄清楚为什么这不起作用。任何意见都将不胜感激。

2 个答案:

答案 0 :(得分:2)

如评论中所述,主要问题是您未在函数中初始化f

这里的工作代码显示了所有必要的变更:

#include <stdio.h>

enum { SIZE = 100 };

static void modeScore(int t[], int num)
{
    int f[SIZE] = { 0 };

    for (int i = 0; i < num; i++)
        f[t[i]]++;
    int mode = 0;
    int max = 0;
    for (int j = 0; j < num; j++)
    {
        if (f[j] > max)
        {
            max = f[j];
            mode = j;
        }
    }

    printf("Part F: %3d is mode (count %d)\n", mode, max);
}

int main(void)
{
    int data[] =
    {
        /* random -n 40 0 9 | commalist -b '        ' -l 38 */
        7, 8, 3, 8, 5, 9, 5, 8, 9, 6,
        8, 0, 1, 8, 2, 0, 3, 4, 3, 3,
        3, 0, 2, 7, 5, 4, 6, 5, 9, 0,
        1, 9, 1, 7, 8, 0, 5, 4, 0, 8,
    };

    enum { DATA_SIZE = sizeof(data) / sizeof(data[0]) };

    modeScore(data, DATA_SIZE);

    return 0;
}

对于给定的数据,输出为:

Part F:   8 is mode (count 7)

(有趣的巧合:我第一次运行它 - 数据略有不同 - 答案回复为Part F: 0 is mode (count 7)。这实际上是正确的;我将其中一个零改为八来产生当前结果。 )

请注意,我通常会设计函数来返回模态值,而不是让它进行打印。就目前而言,它无法重复使用,因为打印对大多数想要确定模式的代码都不重要。 该代码也不会检查t中的值是否属于0 .. SIZE-1范围内(但它应该)。

您使用的参数顺序是传统的,但使用时至少名义上有一些优势:

void modeScore(int num, int t[num])

明确表示数组t中包含num个元素。但是,大小必须先于数组dimentson中的使用。

答案 1 :(得分:1)

由于您说数组已排序,因此您无需创建临时数组来计算值。相反,您只需要遍历输入,并计算您在当前运行中看到的相同值的数量。在运行结束时,然后将运行长度与上一次最长运行进行比较,并在新运行时间更新时进行更新。

(实际上,只要当前的运行时间更长,我们就会更新,所以如果模式是最后一个值,我们不会忘记更新。)

请注意,我们不再需要SIZE来绑定我们的值;如果我们愿意,我们现在可以使用int的全部范围。

#include <stdio.h>

static void modeScore(const int t[], int num)
{
    int start = 0;
    int mode = t[0];
    int score = 0;

    for (int i = 1; i < num; ++i) {
        if (i - start > score) {
            // a longer run than the previous candidate
            score = i - start;
            mode = t[start];
        }
        if (t[start] != t[i])
            // we've reached a change in value
            start = i;
    }

    printf("Part F: %3d is mode (count %d)\n", mode, score);
}

你没有提供main(),所以我改编了Jonathan Leffler:

int main(void)
{
    int data[] =
    {
        /* random -n 40 0 9 | commalist -b '        ' -l 38 */
        0, 0, 0, 0, 0, 0, 1, 1, 1, 2,
        2, 3, 3, 3, 3, 3, 4, 4, 4, 5,
        5, 5, 5, 5, 6, 6, 7, 7, 7, 8,
        8, 8, 8, 8, 8, 8, 9, 9, 9, 9,
    };

    modeScore(data, sizeof data / sizeof data[0]);

    return 0;
}