2013-09-29 103 views
0

我有下面的代码只为一列进行排序,我想按照多个列进行排序,例如拳头名和姓。我想说明的是,我已经尝试添加另一个strcmp陈述& &但它没有给出正确的结果。 这里是我的代码:多列气泡排序?

struct Car tempCar; 
tempCar.CarMake = (char*)malloc(200 *sizeof(char)); 
tempCar.CarMakeYear = (char*)malloc(200 *sizeof(char)); 
tempCar.CarModel = (char*)malloc(200 *sizeof(char)); 
tempCar.Occurances = 0; 

int g, didSwap = 1, limit = newCarsCounter - 1; 

//Sort by make 
while (didSwap) { 
    didSwap = 0; 
    for (g = 0; g < newCarsCounter; g++) { 
     if ((strcmp (newCars[g].CarMake, newCars[g+1].CarMake) > 0)) 
     { 
      tempCar.CarMake = newCars[g].CarMake; 
      tempCar.CarModel = newCars[g].CarModel; 
      tempCar.CarMakeYear = newCars[g].CarMakeYear; 
      tempCar.Occurances = newCars[g].Occurances; 

      newCars[g].CarMake = newCars[g+1].CarMake; 
      newCars[g].CarModel = newCars[g+1].CarModel; 
      newCars[g].CarMakeYear = newCars[g+1].CarMakeYear; 
      newCars[g].Occurances = newCars[g+1].Occurances; 

      newCars[g+1].CarMake = tempCar.CarMake; 
      newCars[g+1].CarModel = tempCar.CarModel; 
      newCars[g+1].CarMakeYear = tempCar.CarMakeYear; 
      newCars[g+1].Occurances = tempCar.Occurances; 

      didSwap = 1; 
     } 
    } 
    limit--; 
} 

回答

1

说你要排序CarMake,然后CarModel,它应该是足够只需更换:

if ((strcmp (newCars[g].CarMake, newCars[g+1].CarMake) > 0)) 

有:

if (strcmp(newCars[g].CarMake, newCars[g+1].CarMake) > 0 || 
    (strcmp(newCars[g].CarMake, newCars[g+1].CarMake) == 0 && 
    strcmp(newCars[g].CarModel, newCars[g+1].CarModel) > 0)) 

所以,只有当CarMake值相等时,我们才会比较CarModel

在效率方面,你可能希望只计算的比较,一旦结果:

int compareVal = strcmp(newCars[g].CarMake, newCars[g+1].CarMake); 
if (compareVal > 0 || 
    (compareVal == 0 && 
    strcmp(newCars[g].CarModel, newCars[g+1].CarModel) > 0)) 
0

如果要排序的模型,然后让:

int CompareCar (struct Car *a, struct Car *b) { 
    int cmp = strcmp(a->CarMake, b->CarMake); 
    if (cmp != 0) { 
     return cmp; 
    } else { // equal makes, compare by model 
     return strcmp(a->CarModel, b->CarModel); 
    } 
} 

这可缩短为:

int ComapreCar (struct Car *a, struct Car *b) { 
    return strcmp(a->CarMake, b->CarMake) || strcmp(a->CarModel, b->CarModel); 
} 

然后更换

if ((strcmp (newCars[g].CarMake, newCars[g+1].CarMake) > 0)) 

if (CompareCar(&(newCars[g]), &(newCars[g+1]) > 0)