2013-09-29 6 views
0

У меня есть следующий код, который сортируется только для одного столбца, я хочу сортировать по нескольким столбцам, например, имя и фамилию последнего. Я хочу отметить, что я попробовал добавить еще один strcmp statment с & &, но он не дал правильного результата. Вот мой код:Bubble сортировать для множества столбцов?

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) 
Смежные вопросы