按 2 个字段插入排序结构数组
Insertion sort array of structure by 2 fields
我正在制作一个 uno 纸牌游戏,其纸牌结构包含以下字段:
struct card
{
int rank
char *color
char *action.
}
我可以通过插入使其按颜色排序。我想知道如何先按颜色对uno卡数组进行排序,然后对每种颜色的等级进行排序。
假设结构名为 card,c1 和 c2 是指向结构对象的两个指针。
在这种情况下,您应该使用以下条件来比较数组的元素
int comparison( card *c1, card *c2 )
{
int color_cmp = strcmp( c1->color, c2->color );
return color_cmp < 0 || ( color_cmp == 0 && c1->rank < c2->rank );
}
此谓词被视为布尔谓词。如果您需要比较函数,它们将在标准算法 qsort
中使用,那么您必须将其更改为 returns -1、0 或 1。
例如
int comparison( const void *p1, const void *p2 )
{
const card *c1 = ( const card * )p1;
const card *c2 = ( const card * )p2;
int color_cmp = strcmp( c1->color, c2->color );
if ( color_cmp < 0 )
{
return -1;
}
else if ( color_cmp > 1 )
{
return 1;
}
else
{
return ( c2->rank < c1->rank ) - ( c1->rank < c2->rank );
}
}
假设您正在重载 operator <
,您应该实施一个条件来比较卡片的颜色和它们的等级。由于您希望主要排序标准是颜色,因此您应该首先检查该标准。我会像这样实现它:
int colorCompareResult = strcmp(card1.color, card2.color);
if (colorCompareResult < 0)
return true;
else if (colorCompareResult == 0 && card1.rank < card2.rank)
return true;
else
return false;
感谢 Bo Persoson,这就是我的问题的解决方案
void sort(card *a, int length) {
int j;
for (int i = 1; i < length; i++) {
j = i;
while (j > 0 && a[j].color < a[j - 1].color || (a[j].color == a[j - 1].color && a[j].rank < a[j - 1].rank)) {
swap(&a[j], &a[j - 1]);
j--;
}
}
}
我正在制作一个 uno 纸牌游戏,其纸牌结构包含以下字段:
struct card
{
int rank
char *color
char *action.
}
我可以通过插入使其按颜色排序。我想知道如何先按颜色对uno卡数组进行排序,然后对每种颜色的等级进行排序。
假设结构名为 card,c1 和 c2 是指向结构对象的两个指针。
在这种情况下,您应该使用以下条件来比较数组的元素
int comparison( card *c1, card *c2 )
{
int color_cmp = strcmp( c1->color, c2->color );
return color_cmp < 0 || ( color_cmp == 0 && c1->rank < c2->rank );
}
此谓词被视为布尔谓词。如果您需要比较函数,它们将在标准算法 qsort
中使用,那么您必须将其更改为 returns -1、0 或 1。
例如
int comparison( const void *p1, const void *p2 )
{
const card *c1 = ( const card * )p1;
const card *c2 = ( const card * )p2;
int color_cmp = strcmp( c1->color, c2->color );
if ( color_cmp < 0 )
{
return -1;
}
else if ( color_cmp > 1 )
{
return 1;
}
else
{
return ( c2->rank < c1->rank ) - ( c1->rank < c2->rank );
}
}
假设您正在重载 operator <
,您应该实施一个条件来比较卡片的颜色和它们的等级。由于您希望主要排序标准是颜色,因此您应该首先检查该标准。我会像这样实现它:
int colorCompareResult = strcmp(card1.color, card2.color);
if (colorCompareResult < 0)
return true;
else if (colorCompareResult == 0 && card1.rank < card2.rank)
return true;
else
return false;
感谢 Bo Persoson,这就是我的问题的解决方案
void sort(card *a, int length) {
int j;
for (int i = 1; i < length; i++) {
j = i;
while (j > 0 && a[j].color < a[j - 1].color || (a[j].color == a[j - 1].color && a[j].rank < a[j - 1].rank)) {
swap(&a[j], &a[j - 1]);
j--;
}
}
}