当我在函数中实现冒泡排序时它不起作用

Bubble sort not working when I implement it in a function

我有这段代码可以根据他们的分数对一组球队进行排序,就像足球排名一样,代码在这样实现时工作正常(顺便说一句,我将“NEQS”定义为 18):

int melhor_class(t_equipa *eqA, t_equipa *eqB)
{
    if(eqA->pontos > eqB->pontos){
        return 1;
    } else if(eqA->pontos < eqB->pontos){
        return 0;
    } else if(eqA->golosM > eqB->golosM){
        return 1;
    } else if(eqA->golosM < eqB->golosM){
        return 0;
    } else if(eqA->golosS < eqB->golosS){
        return 1;
    } else if(eqA->golosS > eqB->golosS){
        return 0;
    } else {
        return 1;
    }
}

void ordenar_equipas(t_equipa *e)
{
    for(int i = 0; i < NEQS - 1; i++)
    {
        for(int j = 0; j < NEQS - i - 1; j++)
        {
            if (melhor_class(&e[j],&e[j+1]) == 0)
            {
                //swaping part
                t_equipa temp = e[j];
                e[j] = e[j+1];
                e[j+1] = temp;
                
            }
        }
    }
}

并且输出工作正常,整理如下:

                         P  V  E  D  M  S
Gil Vicente             33  0  0  0  18  7
Benfica                 32  0  0  0  10  10
Sporting                31  0  0  0  10  7
Porto                   24  0  0  0  20  8
Arouca                  0  0  0  0  0  0
Belenenses              0  0  0  0  0  0
Boavista                0  0  0  0  0  0
Braga                   0  0  0  0  0  0
Estoril                 0  0  0  0  0  0
Famalicao               0  0  0  0  0  0
Maritimo                0  0  0  0  0  0
Moreirense              0  0  0  0  0  0
Pacos Ferreira          0  0  0  0  0  0
Portimonense            0  0  0  0  0  0
Santa Clara             0  0  0  0  0  0
Tondela                 0  0  0  0  0  0
Vitoria                 0  0  0  0  0  0
Vizela                  0  0  0  0  0  0

但是当我把代码的交换部分放在一个函数中时,它就不起作用了:

void trocar_equipas(t_equipa *e, int p1, int p2)
{
    t_equipa temp = e[p1];
    e[p1] = e[p2];
    e[p2] = temp;

}

void ordenar_equipas(t_equipa *e)
{
    for(int i = 0; i < NEQS - 1; i++)
    {
        for(int j = 0; j < NEQS - i - 1; j++)
        {
            if (melhor_class(&e[j],&e[j+1]) == 0)
            {
                trocar_equipas(&e,j,j+1);
            }
        }
    }
}

输出:

                        P  V  E  D  M  S
Arouca                  0  0  0  0  0  0
Belenenses              0  0  0  0  0  0
Benfica                 32  0  0  0  10  10
Boavista                0  0  0  0  0  0
Braga                   0  0  0  0  0  0
Estoril                 0  0  0  0  0  0
Famalicao               0  0  0  0  0  0
Gil Vicente             33  0  0  0  18  7
Maritimo                0  0  0  0  0  0
Moreirense              0  0  0  0  0  0
Pacos Ferreira          0  0  0  0  0  0
Porto                   24  0  0  0  20  8
Portimonense            0  0  0  0  0  0
Santa Clara             0  0  0  0  0  0
Sporting                31  0  0  0  10  7
Tondela                 0  0  0  0  0  0
Vitoria                 0  0  0  0  0  0
Vizela                  0  0  0  0  0  0

我真的需要把那个交换部分放在另一个函数中!我感谢任何类型的帮助!谢谢

函数trocar_equipas接收一个指针作为参数,所以你可以像这样传递它:

void trocar_equipas(t_equipa *e, int p1, int p2)
{
    t_equipa temp = e[p1];
    e[p1] = e[p2];
    e[p2] = temp;

}

void ordenar_equipas(t_equipa *e)
{
    for(int i = 0; i < NEQS - 1; i++)
    {
        for(int j = 0; j < NEQS - i - 1; j++)
        {
            if (melhor_class(&e[j],&e[j+1]) == 0)
            {
                trocar_equipas(e,j,j+1);
            }
        }
    }
}

本次调用的第一个参数表达式

trocar_equipas(&e,j,j+1);

不正确。

它具有 t_equipa ** 类型,而函数 trocar_equipas 需要 t_equipa *.

类型的参数
void trocar_equipas(t_equipa *e, int p1, int p2)
{
    t_equipa temp = e[p1];
    e[p1] = e[p2];
    e[p2] = temp;

}

所以像这样调用函数

trocar_equipas(e,j,j+1);

另一种方法是通过以下方式声明和定义函数trocar_equipas

void trocar_equipas( t_equipa *e1, t_equipa *e2 )
{
    t_equipa temp = *e1;
    *e1 = *e2;
    *e2 = temp;
}

并称其为

trocar_equipas( &e[j], &e[j+1] );

trocar_equipas( e + j, e + j + 1 );

旁白:一个简化的比较函数。

int melhor_class(const t_equipa *eqA, const t_equipa *eqB) {
  if (eqA->pontos != eqB->pontos) {
    return eqA->pontos > eqB->pontos;
  }
  if (eqA->golosM != eqB->golosM) {
    return eqA->golosM > eqB->golosM;
  }
  return eqA->golosS < eqB->golosS;
}

一个更常见的设计习惯用法是 return 1 on greater, -1 on less and 0 on 等于.

  if (eqA->pontos != eqB->pontos) {
    return eqA->pontos > eqB->pontos ? 1 : -1;
  }
  ...