当我在函数中实现冒泡排序时它不起作用
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;
}
...
我有这段代码可以根据他们的分数对一组球队进行排序,就像足球排名一样,代码在这样实现时工作正常(顺便说一句,我将“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;
}
...