对象数组的选择排序

selection sort for array of objects

考虑到我有数据,我正在尝试对对象数组进行选择排序 class

我想根据对象的 id 属性对它们进行排序

class Data
{
public:
    string name;
    int id;
};

    }
int main()
{
    Data m[3];
    m[0].id = 5;
    m[1].id = 4;
    m[2].id = 8;
    selsort(m, 3);
    cout << m[0].id;
};

我不明白数组有什么问题吗?

函数声明好像有错字

void selsort(media mry[], int n)
             ^^^^^

我想你是说

void selsort( Data mry[], int n)
              ^^^^

这个if语句

if ((mry[min].id < mry[j].id) < 0)

没有意义。

你应该写

if ( mry[min].id < mry[j].id )

或者如果你想按升序排序,那么条件写成

if ( mry[j].id < mry[min].id )

变化:

if ((mry[min].id < mry[j].id) < 0)

至:

if ((mry[min].id > mry[j].id) )

您正在查找最小索引,因此如果您找到的索引的值小于当前最小值,则必须进行交换。

实现此目的的更好方法是让您的函数接受另一个称为比较器函数的参数,该参数告诉函数如何进行比较;这样,如果您改变主意并根据另一个参数对它进行排序,就可以重用您的函数。

void selsort(Data mry[], int n, std::function<int(Data, Data)> cmp) // mry[] is the object array, n is the 
                                     // number of objects in the array
    {
        int pass, j, min;
        Data temp;
        for (pass = 0; pass <= n - 2; pass++)  // passes
        {
            min = pass;
            for (j = pass + 1; j < n; j++)  // in each pass
                if (cmp(mry[min], mry[j]) > 0)
                    min = j;
            temp = mry[min];
            mry[min] = mry[pass];
            mry[pass] = temp;
        }

    }

您可以通过 id 函数定义比较:

int compare_by_id(Data d1, Data d2) 
{
    return d1.id - d2.id;
}

像这样调用你的函数:

selsort(array, size, compare_by_id);

最好的部分是您可以定义自己的函数来比较您想要的元素,这样您的 selsort() 就很灵活了。