【问题标题】:Selection Sort troubles with keeping pointers in correct spots post sort在排序后将指针保持在正确位置的选择排序问题
【发布时间】:2024-01-09 10:25:02
【问题描述】:

我正在尝试执行选择排序,其中我按得分最多的目标进行排序。我有3个类别;目标,助攻,名字。我可以按目标正确排序,并在排序后将球员的目标和助攻保持在正确的位置,但是当我尝试在排序后将名称移动到正确的位置时,它只会移动名称的第一个字母。这是我的代码。感谢您的帮助!

void sortPlayersByGoals(int* goals, int* assists, char** names, int size)
{
    int lh, rh, i, tempG, tempA, tempN;
    for(lh = 0; lh < size; lh++)
    {
            rh = lh;
            for(i = lh; i < size; i++)
            {
                    if(goals[i] > goals[rh])
                    {
                            rh = i;
                    }
            tempG = goals[lh];
            tempA = assists[lh];
            tempN = *names[lh];
            goals[lh] = goals[rh];
            *names[lh] = *names[rh];
            assists[lh] = assists[rh];
            goals[rh] = tempG;
            *names[rh] = tempN;
            assists[rh] = tempA;
            }
    }

}

如果这有助于显示我的问题,这是我的输出..

Pre-Sort
Name                       Goals                   Assists
Redden                         2                         0
Berglund                       5                         2
Jackman                        2                         0
Stewart                        4                         0
Oshie                          3                         5
McDonald                       2                         4
Pietrangelo                    2                         7
Perron                         2                         6
Tarasenko                      5                         5
Post-Sort
Name                       Goals                   Assists
Tedden                         5                         5
Berglund                       5                         2
Sackman                        4                         0
Otewart                        3                         5
Rshie                          2                         0
McDonald                       2                         4
Pietrangelo                    2                         7
Perron                         2                         6
Jarasenko                      2                         0

【问题讨论】:

    标签: c string sorting pointers selection


    【解决方案1】:
    void sortPlayersByGoals(int* goals, int* assists, char** names, int size)
    {               /*  names is an array of pointers to char   */
        int lh, rh, i, tempG, tempA;
        char *tempN;     /* a pointer to one name */
        for(lh = 0; lh < size; lh++)
        {
                rh = lh;
                for(i = lh; i < size; i++)
                {
                        if(goals[i] > goals[rh])
                        {
                                rh = i;
                        }
                tempG = goals[lh];
                tempA = assists[lh];
                tempN = names[lh]; /* names[lh] is a pointer to the name in pos lh */
                goals[lh] = goals[rh];
                names[lh] = names[rh]; /* swap the pointers */
                assists[lh] = assists[rh];
                goals[rh] = tempG;
                names[rh] = tempN;  /* and not just the first letter */
                assists[rh] = tempA;
                }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      看看你手上的相关字符复制码:

      int tempN;
      ...
      tempN = *names[lh];
      *names[lh] = *names[rh];
      *names[rh] = tempN;
      

      您的“名称”变量是char**(我假设它被实例化为char* 的数组,然后您将其作为指针传递),所以当您执行*names[lh] 时,您首先要索引到你的char** 在索引lh 处获取char*,然后取消引用它。这与在索引 lh 处索引到 char* 的第 0 个元素相同,它为您提供了第一个字符。由于您对所有与名称相关的操作都执行此操作,因此您只会在名称的第一个字符周围移动。此外,您的 tempN 变量被声明为 int,这可能不是您想要的。

      您可以通过循环遍历要复制的名称的长度并逐个字符地分配它(而不是像现在这样只使用第一个字符)来修复它(对您的代码进行最小的修改)。或者您可以使用 strcpy(或其变体之一,请参阅 http://msdn.microsoft.com/en-us/library/kk6xf663%28v=vs.110%29.aspx 以获取参考)

      顺便说一句,如果可能的话,我会提倡你只使用字符串来代替。此外,您可能想要考虑让您的数据更紧密地耦合,即拥有一个包含玩家{名称、目标和助攻}的玩家结构列表,然后重新排列您的列表,但我想这是一个设计决策由你决定。

      【讨论】: