Простой способ сортировки «чисел с прикрепленными именами» состоит в том, чтобы поместить число и имя в struct
и получить массив из этого struct
.Затем просто используйте стандартную функцию qsort
для сортировки массива.
Это может выглядеть так:
#include <stdio.h>
#include <stdlib.h>
// Define a type to hold the score together with the name of the player
typedef struct
{
char name[42];
int score;
} PlayerStats;
// Make a compare function to be used by qsort
int cmpfunc (const void * a, const void * b){
const PlayerStats* pA = a;
const PlayerStats* pB = b;
if (pA->score > pB->score) return -1;
if (pA->score < pB->score) return 1;
return 0;
}
// A function for printing the players and their score
void print_stats(PlayerStats *ps, size_t n)
{
for(size_t i=0; i<n; ++i) printf("%s : score=%d\n", ps[i].name, ps[i].score);
}
int main(){
// Make an array of players with scores.
PlayerStats player_stats[3] = {{"p1", 17}, {"p2", 9}, {"p3", 42}};
size_t numElements = sizeof player_stats / sizeof player_stats[0];
size_t sizeElement = sizeof player_stats[0];
printf("Unsorted:\n");
print_stats(player_stats, numElements);
// Use the standard qsort for sorting the array
qsort(player_stats, numElements, sizeElement, cmpfunc);
printf("Sorted:\n");
print_stats(player_stats, numElements);
return 0;
}
Вывод:
Unsorted:
p1 : score=17
p2 : score=9
p3 : score=42
Sorted:
p3 : score=42
p1 : score=17
p2 : score=9
Попробуйте здесь:https://ideone.com/HMgDbn
Если вы хотите отсортировать по возрастанию, просто измените функцию сравнения следующим образом:
int cmpfunc (const void * a, const void * b){
const PlayerStats* pA = a;
const PlayerStats* pB = b;
if (pA->score > pB->score) return 1; // Change -1 to 1
if (pA->score < pB->score) return -1; // Change 1 to -1
return 0;
}