【问题标题】:Selection sort logic error选择排序逻辑错误
【发布时间】:2011-10-17 10:38:08
【问题描述】:

我正在使用选择排序对来自板球队的名单进行排序。

在首先重复一个名称 3 次后排序起作用,这从我正在排序的数组中消除了另外两个名称。

从数组输入(按顺序):

Clarke Watson Beer Copeland Haddin Harris Hughes Hussey Johnson Khawaja Lyon Marsh Pattinson Ponting Siddle Warner

排序后的输出:

啤酒 啤酒 啤酒 Copeland Haddin Harris Hughes Hussey Johnson Khawaja Lyon Marsh Pattinson Ponting

代码:

void sort_names (Team_t player[]) {
    int pos;
    int min;
    int i, str_check;
    char *temp = NULL;

    for (pos = 0; pos < MAX_PLYR; pos++) {
        min = pos;

        for (i = (pos + 1); i < MAX_PLYR; i++) {
            str_check = strcmp(player[i].pname, player[min].pname);

            if (str_check < 0) {
                min = i;
            }

        }

        if (min != pos) {
            temp = player[pos].pname;
            strcpy(player[pos].pname, player[min].pname);
            strcpy(player[min].pname, temp);
        }
    }    
}

【问题讨论】:

  • 您是否尝试过使用调试器(甚至笔和纸)单步执行代码以查看发生了什么?
  • 我可能遗漏了一些东西,我已经在办公桌上检查了几次,然后断点了。
  • 你的代码在喝了“啤酒”后喝醉了:-/

标签: c arrays string logic selection


【解决方案1】:

您的这段代码不会正确交换条目:

temp = player[pos].pname;
strcpy(player[pos].pname, player[min].pname);
strcpy(player[min].pname, temp);

第一行将一个 指针 保存到 'pos' 玩家的名字到temp - 不是 名字本身。然后第一个 strcpy 覆盖它 - 它丢失了。 (第二个 strcpy 只是将相同的字符串复制回原来的位置。)这就是为什么您会看到首先排序的项目不止一次出现。

【讨论】:

  • 对。对字符串进行排序可能会更好、更安全,而是对它们的指针进行排序,pnameplayer[] 中的值。
  • 谢谢马丁!解决了。我明白我现在做错了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多