2014-12-15 5 views
0

Я пытаюсь реализовать рекурсивный bubblesort для массива структур. Но это приводит к неправильному результату, когда я сортирую массив по имени Employee. Я не могу понять, чего не хватает. Любая помощь приветствуется.Рекурсивный BubbleSort, дающий неправильный результат

#include<stdio.h> 
#include<stdlib.h> 

// GLOBAL VARIABLES 
char *stringDataType = "string"; 
char *integerDataType = "integer"; 

// Employee structure 
struct Employee 
{ 
    char *name; 
    int age; 
}; 

// Method to swap two structures by reference. 
void Swap(struct Employee *first, struct Employee *second) 
{ 
    struct Employee temp = *first; 
    *first = *second; 
    *second = temp; 
} 

// Method to check if the first string is greater than second string or not 
// 1 if the first string is greater 
// -1 if the seond string is greater 
// 0 if both the strings are equal 
int IsGreaterThan(char **first , char **second) 
{ 
    int index = 0; 
    while(*((*first)+index) == *((*second)+index)) 
    { 
     index++; 
    } 

    if(*((*first)+index) > *((*second)+index)) 
    { 
     return 1; 
    } 
    else if(*((*first)+index) < *((*second)+index)) 
    { 
     return -1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

// Method to check if the first structure is greater than second structure or not 
// 1 if the first structure is greater 
// -1 if the seond structure is greater 
// 0 if both the structure are equal 
int IsStructGreaterThan(struct Employee *first, struct Employee *second) 
{ 
    int index = 0; 

    return IsGreaterThan(&(*first).name, &(*second).name); 
} 

// Bubble Sort Method 
void BubbleSort(struct Employee array[], int size, char *dataType, int swapped) 
{ 
    int i; 

    if(swapped == 0 || size == 0) 
    { 
     return; 
    } 

    for(i = 0; i < size - 1; i++) 
    { 
     swapped = 0; 

     if(dataType==stringDataType && (IsStructGreaterThan(&array[i], &array[i+1]) == 1) || dataType==integerDataType && array[i].age > array[i+1].age) 
     { 
      Swap(&array[i], &array[i + 1]); 
      swapped = 1; 
     } 
    } 

    BubbleSort(array, size-1, dataType, swapped); 
} 

// Entry point of the program 
int main() 
{ 
    struct Employee array[] = {{"John", 45}, {"Mary", 23}, {"Celina", 79}, {"Mike", 41}}; 
    int arraySize = 4; 
    int index; 

    printf("Before Sorting : \n"); 
    for(index = 0; index < arraySize; index++) 
    { 
     printf("(%s, %d) ", array[index].name, array[index].age); 
    } 

     printf("\n"); 

    int swapped = 1; 

    BubbleSort(array, arraySize, stringDataType, swapped); 
    printf("After Sorting by name : \n"); 
    for(index = 0; index < arraySize; index++) 
    { 
     printf("(%s, %d) ", array[index].name, array[index].age); 
    } 

     printf("\n"); 

    BubbleSort(array, arraySize, integerDataType, swapped); 
    printf("After Sorting by age : \n"); 
    for(index = 0; index < arraySize; index++) 
    { 
     printf("(%s, %d) ", array[index].name, array[index].age); 
    } 

    printf("\n");  
    return 0; 
} 

ВЫХОДА

Before Sorting :                
(John, 45) (Mary, 23) (Celina, 79) (Mike, 41)         
After Sorting by name :              
(John, 45) (Celina, 79) (Mary, 23) (Mike, 41)         
After Sorting by age :               
(Mary, 23) (Mike, 41) (John, 45) (Celina, 79) 
+2

Проверьте, что произойдет с вашей функцией 'IsGreaterThan', если имена равны (не маловероятный сценарий в реальных реализациях!) – CiaPan

+3

Помимо проблемы сравнения строк (что много на этом сайте), ваш алгоритм неверен. Для правильной сортировки пузырьков любая отдельная * развертка *, которая приводит к 'swapped == 0', должна заканчивать весь вид. Вы перегружаете 'swapped = 0;' перед каждым * сравнением *. Это не правильно; он не принадлежит вашему циклу for-loop. Он должен быть * после * быстрого выхода, если он пришел к функции, но * before * for-loop. – WhozCraig

+0

В сравнении есть определенная ошибка. Если две строки равны, то после цикла, 'index' будет ссылаться после конца строк, и окончательное сравнение будет состоять из символов, не входящих в строки. Однако это не ваша ошибка, потому что вы не сортируете дубликаты. – Persixty

ответ

1

swapped = 0 поставил перед для цикла, а не внутри него, и зафиксировать сравнение строк, как в других ответах.

4

Строка должна быть сопоставлена ​​с помощью strcmp() вместо операторов сравнения.

Вы можете изменить IsStructGreaterThan() в

int IsStructGreaterThan(struct Employee *first, struct Employee *second) 
{ 
    return strcmp(first->name, second->name); 
} 
+0

@timraru он не работает. Имя не сортируется иначе, чем оно работает. '(Иоанн, 45) (Селина, 79) (Мэри, 23) (Майк, 41)' это результат в соответствии с вашим ответом. –

+1

сравнение строк в OP багги, но ошибок больше. – sp2danny

Смежные вопросы