Сортировка по двум критериям - PullRequest
0 голосов
/ 19 января 2019

Я пишу код, и в середине я должен отсортировать некоторые данные.Например, у нас есть структура с именем фрукты, как это:

struct fruits{
int price;
int quality;
};

(0 <= качество <= 10 и цена может быть любым положительным целым числом) </p>

Мы получаем массив фруктов изпользователь и мы получаем цену и качество каждого фрукта.

Затем я хочу напечатать информацию о фруктах в том порядке, чтобы сначала печатались более дешевые фрукты, и если цена была такой же, как информация о фруктах,лучшего качества должны быть напечатаны в первую очередь.

например: ввод: 4 0

4 5

3 2

6 8

6 4

(первое - это цена, второе - это качество)

выход:

3 2

4 5

4 0

6 8

6 4

Мне нужна помощь в сортировке, потому что я понятия не имею, как мы можем сортировать по двум критериям

Ответы [ 2 ]

0 голосов
/ 19 января 2019
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int price;
    int quality;
} fruit;



int cmpfruits(const void* p1, const void* p2) {
    const fruit* f1=p1;
    const fruit* f2=p2;
    if ( f1->price <  f2->price ) return -1;
    if ( f1->price == f2->price ) {
        if ( f1->quality <  f2->quality ) return 1;
        if ( f1->quality >  f2->quality ) return -1;
        return 0;
    }
    return 1;
}

int main() {
    fruit f[] = {{1,2},{1,1},{1,3},{2,0},{-1,100}};
    qsort(&f,sizeof(f)/sizeof(fruit),sizeof(fruit),cmpfruits);
    for(int i=0; i<5; i++) {
        printf("%i/%i\n", f[i].price, f[i].quality);
    }
}
0 голосов
/ 19 января 2019

Вы должны использовать стандартную функцию qsort. Вам нужно написать функцию сравнения, которая соответствует вашим потребностям. Здесь сначала попытайтесь сделать выбор по цене, и если они одинаковы, измените качество.

int fruit_cmp(void *a, void *b)
{
    struct fruits *fa = a, *fb = b;
    if (fa->price < fb->price)
        return 1;
    if (fa->price > fb->price)
        return -1;
    if (fa->quality < fb->quality)
        return -1;
    if (fa->quality > fb->quality)
        return 1;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...