0

我有一系列关于建筑物的信息,其中一个项目是建造年份的:

 buildingnumber[buildingsloaded].yearBuilt

我正在尝试使用插入排序将数据从最旧的构建到最新构建的数据进行排序,但它一直为 k 报告相同的构建。(k是我想看的建筑数量)

void InsertionSort(list buildingnumber[SIZE], int buildingsloaded)
{
int key = 0, i = 0;
    for(int j = 1; j < buildingsloaded; j++)
    {
        key=buildingnumber[j].yearBuilt;
        i=j-1;
        while(buildingnumber[i].yearBuilt > key && i >= 0)
        {
           buildingnumber[i+1] = buildingnumber[i];
           i--;
        }
        buildingnumber[i+1].yearBuilt = key;
    }
}
4

2 回答 2

0

你的代码很混乱。您可以编写一种仅比较某物的一部分(例如yearBuilt)的排序,但是当您实际进行排序时,您必须移动(或交换)整个对象而不仅仅是键。

所以你的代码可以像这样改进

     list b = buildingnumber[j]; // whole building
     key = b.yearBuilt;
     while (...)
     {
         ...
     }
     buildingnumber[i+1] = b;  // whole building

不完全确定现在代码是否正确(尚未检查),但至少你会更接近一点。

另一件事,为什么你的建筑对象被称为list?不是Building更好的名字吗?在代号中重要,而且它们很容易更改。如果您可以为您的类型和变量选择好的名称,则表明您正在清楚地考虑问题。不要吝啬这一点或认为这无关紧要。

于 2012-11-11T08:21:03.757 回答
0

发布的代码包含一个重要错误

while(buildingnumber[i].yearBuilt > key && i >= 0)

因为条件必须以相反的顺序写:

while (i >= 0 && buildingnumber[i].yearBuilt > key)

原因是当 时i<0,您不想访问buildingnumber[i],因为那会访问数组的无效位置。因为&&将评估到false第一个操作数false不评估第二个操作数时,以正确的方式不会执行无效访问。

另一方面,如另一个答案中所述,代码不会对孔list元素进行排序,而只是对它们的键进行排序。

此外,keyi变量可以定义在更小的块中。

于 2012-11-11T09:17:51.810 回答