Сортировать эти элементы в порядке убывания?

Экспериментирую с qsort, и он отлично работает для меня. Я использую указатели функций по всей программе и некоторые другие функции, к которым я не привык (например, пустые указатели).

Однако я хочу, чтобы элементы располагались в порядке убывания (то есть в отличие от порядка возрастания). Что я могу сделать, чтобы достичь этого?

Вот код:

#include <iostream>
#include <cstdlib>  // Required for qsort
#include <cstring>
using std::cout;
using std::endl;

int compare_strs( const void *arg1, const void *arg2 );
int compare_ints( const void* arg1, const void* arg2 );

int main()
{
char * shrooms[10] =
{
"Matsutake", "Lobster", "Oyster", "King Boletus",
"Shaggy Mane", "Morel", "Chanterelle", "Calf Brain",
"Pig's Ear", "Chicken of the Woods"};

int nums[10] = {99, 43, 23, 100, 66, 12, 0, 125, 76, 2};

// The address of the array, number of elements
// the size of each element, the function pointer to
// compare two of the elements
qsort( (void *)shrooms, 10, sizeof( char * ), compare_strs );
qsort( (void *)nums, 10, sizeof( int * ), compare_ints );

// Output sorted lists
for ( int i = 0; i < 10; ++i )
cout << shrooms[i] << endl;

for ( int i = 0; i < 10; ++i )
cout << nums[i] << endl;

return 0;
}

int compare_ints( const void * arg1, const void * arg2 )
{
int return_value = 0;

if ( *(int *)arg1 < *(int *)arg2 )
return_value = -1;
else if ( *(int *)arg1 > *(int *)arg2 )
return_value = 1;

return return_value;
}

int compare_strs( const void * arg1, const void * arg2 )
{
return ( _stricmp( *(char **) arg1, *(char **) arg2 ) );
}

Программа выводит в порядке возрастания (то есть начиная с мозгового тельца), но я пытаюсь заставить его начать с Мохнатого грива (то есть в порядке убывания). Любая помощь приветствуется.

1

Решение

использование std::sort в сочетании с std::string а также std::greater:

std::string shrooms[10] =
{
"Matsutake", "Lobster", "Oyster", "King Boletus",
"Shaggy Mane", "Morel", "Chanterelle", "Calf Brain",
"Pig's Ear", "Chicken of the Woods"};

std::sort(shrooms, shrooms+10, std::greater<std::string>);

Если вы не хотите использовать std::sort просто инвертируйте либо результат вашей функции сравнения, либо инвертируйте свой результат.

4

Другие решения

Лучше использовать станд :: сортировать. Нет необходимости играть сложным qsort,
Кроме того, вы должны использовать std::string для хранения строк и std::vector хранить их!

РЕДАКТИРОВАТЬ:
Кто-то опубликовал комменет о том, что std :: sort не будет магическим образом изменять логику сортировки, поэтому вот мой ответ:

И почему бы нет? std::sort Алгоритм также принимает компаратор! Верните отрицательное логическое значение, и все готово!

2

Поменяйте логику функций компаратора.

inline int rcompare_strs( const void *arg1, const void *arg2 )
{
return -1*compare_strs(arg1, arg2);
}

inline int rcompare_ints( const void* arg1, const void* arg2 )
{
return -1*compare_ints(arg1, arg2);
}

qsort( (void *)shrooms, 10, sizeof( shrooms[0] ), rcompare_strs );
qsort( (void *)nums, 10, sizeof( nums[0] ), rcompare_ints );
1
По вопросам рекламы [email protected]