【问题标题】:Why is my program not sorting the struct?为什么我的程序没有对结构进行排序?
【发布时间】:2014-03-05 02:28:39
【问题描述】:

我正在尝试创建这个程序,它从用户那里获取一个 int 数字,然后根据输入在结构数组中随机化一对数字。然后它根据程序随机化的数字对的总和对该数组进行排序。

但是我的程序不会对结构数组进行排序。它没有正确排序,我不知道为什么。这是代码。

#define MAX 10

struct NumPair{
int n,m;
};

int main()
{
    int i, j, amount=0;
    NumPair NumPair[MAX];

    srand(time(NULL));

    printf("How many pair of numbers? (max 10): ");
    scanf("%d", &amount);

    for (i=0; i<amount; i++)
    {
        NumPair[i].n = rand() % 11;
        NumPair[i].m = rand() % 11;
    }

    for (i=0; i<amount; i++)
    {
        for(j=1; j<amount; j++)
        {
            if( (NumPair[i].n+NumPair[i].m) > (NumPair[j].n+NumPair[j].m) )
            {
                int tmp;

                tmp = NumPair[i].n;
                NumPair[i].n = NumPair[j].n;
                NumPair[j].n = tmp;

                tmp = NumPair[i].m;
                NumPair[i].m = NumPair[j].m;
                NumPair[j].m = tmp;
            }
        }
     }

     for (i=0; i<amount; i++)
     {
        printf(" NumPair %d: (%d,%d)\n", i+1, NumPair[i].n, NumPair[i].m);
     }
return 0;
}

我错过了什么?这可能是非常愚蠢的事情。

提前致谢。

【问题讨论】:

  • 请注意,如果您已经定义了此结构,则无需调用struct NumPair Numpair。只需删除 main() 中的关键字 struct

标签: c arrays sorting struct


【解决方案1】:

您的算法不正确。这个小sn-p:

for (i=0; i<amount; i++) {
    for(j=1; j<amount; j++) {

将导致i 大于j 的情况,然后您的比较/交换操作出错(如果i 元素大于j 一个,它会交换如果i &gt; j 是错误的比较)。

我应该提到(除非这是家庭作业或其他教育)C 具有完全足够的qsort() 函数,它将为您完成繁重的工作。建议您学习这一点。

如果它家庭作业/教育,我想我已经给了你足够的东西来解决它。您应该找到您正在尝试实现的特定算法并重新访问您的代码。

【讨论】:

  • 是的,这是作业。感谢您指出我的错误。我现在明白为什么它的行为方式是这样了。干杯。
【解决方案2】:

您正在将迭代器 ij 进行比较。冒泡排序应该将jth 迭代器与下一个迭代器进行比较

for (i=0; i<amount; i++)  //pseudo code
{
    for(j=0; j<amount-1; j++)
    {
        if( NumPair[j] > NumPair[j+1] )  //compare your elements
        {
             //swap
        }
    }
 }

请注意,第二个循环只会持续到 amount-1,因为您不想超出数组的范围。

【讨论】:

    【解决方案3】:

    改成

    for (i=0; i<amount-1; i++){
        for(j=i+1; j<amount; j++){
    

    【讨论】:

    • 感谢@BLUEPIXY。这有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多