【问题标题】:Custom Sorting algorithm (C) [closed]自定义排序算法(C)[关闭]
【发布时间】:2020-03-12 17:48:25
【问题描述】:

今天老师让我们做一个自定义排序算法,他给了我们一些指令,但是我没能解决: 首先,您从随机生成的数组中获取最小的数字并将其分配给单独的数组。然后你得到数组中第二小的数字,并将它分配给单独数组中的下一个位置。

我能够构建它,但它不能完全工作:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ANZAHL 5

int main() {
    srand(time(0));
    int zfeld[ANZAHL], zfeld1[ANZAHL] = {}, zfeld2[ANZAHL] = {}, i, d, ug, og, kl = ANZAHL + 1;
    printf("Gib die untere und obere grenze an");
    scanf("%d%d", &ug, &og);
    for (i = 0; i < ANZAHL; i++) {
        zfeld[i] = rand() % ((og - ug) - 1) + ug + 1;
    }
    for (d = 0; d < ANZAHL; d++) {
        for (i = 0; i < ANZAHL; i++) {
            if (zfeld[i] < kl && zfeld[i] != zfeld2[d - 1]) {
                kl = zfeld[i];
            }
        }
        zfeld2[d] = kl;
    }
    return 0;
}

【问题讨论】:

  • 使用调试器单步调试程序或添加一堆调试输出,看看程序在哪里偏离了您的预期。这可能是一个错误。
  • 对于小程序,您还可以使用铅笔和纸。假装是电脑。自己运行程序。它对数字进行排序吗?为什么不呢?
  • 嗯,我知道程序现在做什么,只是不知道如何让它做我想做的事情。
  • 如果你知道它的作用,你知道你想要什么,而这些不同,那么究竟有什么不同呢?您没有告诉我们您知道,您提供的唯一内容是“它不能完全工作”。有了如此精确的问题描述,您只能希望得到同样精确的答案“努力找出答案”。解释更多。提供样本输入。显示输出。显示不同的预期输出。然后仍然描述那个区别是什么。如果您了解程序的作用(如您所说),那么请解释它在何时何地可能涉及的作用。
  • @Yunnosch 的建议中有趣的部分是写下所有“我有这个,我想要这个”的东西,这经常会动摇大脑中的僵局,然后你就会有一个“哦 我太傻了!”片刻。 Rubber Duck Debugging 也有类似的效果。

标签: c algorithm sorting


【解决方案1】:

几个问题:

  • kl=ANZAHL+1:原数组的长度与values无关。做kl = og 会更有意义。但是,您执行此任务的地方仍然是错误的。一旦找到第一个最小值,kl 将太小而无法检测到 下一个 最小值:每次在外循环中迭代时都需要重新设置它。

    李>
  • 当您已经确定了一些小值时,内部循环不应遍历 所有 元素。您尽量避免两次选择相同的值,但仅与先前确定的值 (zfeld[i] != zfeld2[d-1]) 进行比较是行不通的。首先,因为当d 为零时,这是一个无效的引用,其次:通常zfeld2 中有更多值,您不想再次选择这些值。而是考虑第一个数组应该变得“更短”。您可以通过将数组的最后一个值移动到找到最小值的槽中来做到这一点。然后你可以认为数组变小了一个单元而不会丢失任何信息。要做到这一点,您需要知道找到最小值的索引

所以这里是循环的更正代码:

for(d=0; d<ANZAHL; d++)
{
    // Reset the index, and just consider the first value to the the smallest so far
    int indexOfSmallest = 0;
    // Each time you move one value, we look at one value less in this loop:
    for(i=1; i<ANZAHL - d; i++)
    {
        if(zfeld[i] < zfeld[indexOfSmallest])
        {
            indexOfSmallest = i;
        }
    }
    zfeld2[d] = zfeld[indexOfSmallest];
    // Move last value in the slot that opens up:
    zfeld[indexOfSmallest] = zfeld[ANZAHL - d - 1];
}

注意:这是selection sort 的变体。选择排序不使用第二个数组,因为它重用了第一个数组中释放的空间来存储排序值。

我还建议使用更好的变量名。 klugog 之类的名称您可能很清楚,但最好只使用全名:kleinsteuntereGrenze、...等。

【讨论】:

  • 还要注意生成公式也不正确:zfeld[i] = rand() % ((og - ug) - 1) + ug + 1; 将生成(ug+1)..(og-1) 范围内的数字。 ug 的值可能应该包含在内,这很容易通过 zfeld[i] = rand() % (og - ug + 1) + ug; 实现
猜你喜欢
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多