按 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--;
    }
}

}