结构的选择排序
Posted
技术标签:
【中文标题】结构的选择排序【英文标题】:Selection Sort for struct 【发布时间】:2015-12-02 19:18:23 【问题描述】:我对使用结构数组的选择排序的逻辑有疑问。例如说这是我的结构:
struct data
int month
int day
..
..
现在我想做的是对月份和日期进行排序。我相信我知道如何在几个月内做到这一点,但我很难理解如何在几天内实现这一点。这是我迄今为止几个月的代码:
void sortData(struct Data yearData[], int sz)
int i, j, m;
int temp;
for (i = 0; i < sz; i++)
m = i;
for (j = i + 1; j < sz; j++)
if (yearData[j].month < yearData[m].month)
m = j;
if (m != i)
temp = yearData[i].month;
yearData[i].month = yearData[m].month;
yearData[m].month = temp;
我想我想检查月份是否相同,然后查看日期并对它们进行排序。我只是不知道在这种排序中添加另一个迭代是否正确。谢谢!
【问题讨论】:
仅供参考:C != C++ 并且您通常应该只标记您正在编写/编译的语言(答案可能会有很大差异)。 您不使用 std::sort 的任何特殊原因? 【参考方案1】:试试这个:
...
if((yearData[j].month < yearData[m].month) ||
((yearData[j].month == yearData[m].month) &&
(yearData[j].day < yearData[m].day)))
m = j;
...
但是,我不确定我是否理解您的交换。您应该交换整个结构,而不是一一交换其成员。考虑一下:
if (m != i)
struct Data tmp = yearData[i];
yearData[i] = yearData[m];
yearData[m] = tmp;
【讨论】:
ahhhh 这看起来像我想要它做的。我不交换整个结构的原因是因为其中的成员不仅仅是月份和日期。 这是结构的完整形式: 结构数据 int day;国际月份;整数年;浮得很高;浮低;浮法沉淀;字符条件; ; 我了解,但您想根据元素的月/日对元素进行排序。如果你只移动日期,你实际上是在破坏数据。我敢肯定这不是你想要的。 ahhhh,所以如果您只使用 yearData[ ] 进行交换比较,它将在几个月和几天内执行正确的排序,而不仅仅是几个月?我不知道为什么当它看起来如此简单时,我却在努力理解这一点【参考方案2】:创建一个比较函数,然后使用它的结果。如果结构相等,比较函数应该返回 0,如果左边应该先行,则返回 -1,如果右边应该先行,则返回 +1。
它看起来像:
int yearDataCmp(struct Data left, struct Data right)
if ( left.month < right.month ) return -1;
if ( left.month > right.month ) return 1;
if ( left.day < right.day ) return -1;
if ( left.day > right.day ) return 1;
return 0;
【讨论】:
我不相信我可以为此创建另一个函数。它必须在 void sortData(struct Data yearData[], int sz) 函数中.. 很公平。只需将逻辑嵌入到您的主要功能中。创建一个默认为0
的cmp
变量,然后使用yearDataCmp
函数中的if
语句。无需返回值,只需相应地执行cmp = -1
或cmp = 1
。以上是关于结构的选择排序的主要内容,如果未能解决你的问题,请参考以下文章