Qsort не полностью сортирует все - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу отсортировать все элементы, но qsort не полностью сортирует все.

Если бы у меня были даты

01/01/2019 15:30
01/01/2019 11:15
01/01/2019 17:00
01/01/2019 15:45
01/01/2019 15:30
01/01/2019 08:00

И я точно знаю, что значения правильно заданы в структуре

struct Date{ int year, month, day, hour, minute; }

function(...){ //properly assigns values to Date array }

int comp(const void *t1, const void *t2){
    int t1year = ((const struct Date*)t1)->year;
    int t2year = ((const struct Date*)t2)->year;
    int t1month = ((const struct Date*)t1)->month;
    int t2month = ((const struct Date*)t2)->month;
    int t1day = ((const struct Date*)t1)->day;
    int t2day = ((const struct Date*)t2)->day;
    int t1hour = ((const struct Date*)t1)->hour;
    int t2hour = ((const struct Date*)t2)->hour;
    int t1minute = ((const struct Date*)t1)->minute;
    int t2minute = ((const struct Date*)t2)->minute;

    if (t1year < t2year) 
        return -1; 
    if (t1year == t2year && t1month < t2month) 
        return -1; 
    if (t1year == t2year && t1month == t2month && 
    t1day < t2day) 
        return -1;
    if (t1year == t2year && t1month == t2month && 
    t1day == t2day && t1hour < t2hour)
        return -1;
    if (t1year == t2year && t1month == t2month && 
    t1day == t2day && t1hour == t2hour && t1minute < t2minute)
        return -1;
    if (t1year == t2year && t1month == t2month && 
    t1day == t2day && t1hour == t2hour && t1minute == t2minute)
        return 0;
    return 1;
}
void sortArray(struct Date dates[], int n){
        qsort(dates, n, sizeof(Date), comp);
}
...

//prints through a for loop until n

Результаты были отсортированы, за исключением тех двух, которые имели одинаковое время.

01/01/2019 08:00
01/01/2019 15:30
01/01/2019 11:15    
01/01/2019 15:30
01/01/2019 15:45
01/01/2019 17:00

1 Ответ

1 голос
/ 03 апреля 2019

Функция сравнения для qsort должна возвращать -1, если первое значение меньше, 1, если второе значение меньше, и 0, если оба значения равны. Вы не возвращаете 0 в любом случае, поэтому не возвращаете правильное значение для этого случая.

Вместо того, чтобы создавать все большие и большие условия, чтобы поймать меньше, чем дела, переходите вперед и назад, проверяя наиболее значимые поля и переходя к наименее значимым. Кроме того, вместо этого создайте большое количество временных переменных, создайте два указателя правильного типа и затем используйте их.

int comp(const void *v1, const void *v2)
{
    const struct Date *t1 = v1;
    const struct Date *t2 = v2;

    if (t1->year < t2->year) {
        return -1; 
    } else if (t1->year > t2->year) {
        return 1; 
    } else if (t1->month < t2->month) {
        return -1; 
    } else if (t1->month > t2->month) {
        return 1; 
    } else if (t1->day < t2->day) {
        return -1; 
    } else if (t1->day > t2->day) {
        return 1; 
    } else if (t1->hour < t2->hour) {
        return -1; 
    } else if (t1->hour > t2->hour) {
        return 1; 
    } else if (t1->minute < t2->minute) {
        return -1; 
    } else if (t1->minute > t2->minute) {
        return 1; 
    } else {
        return 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...