0

建物に関する一連の情報があり、そのうちの 1 つは築年数です。

 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

投稿されたコードには、重要なエラーが含まれています

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

条件は逆の順序で記述しなければならないためです。

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

その理由は、配列の無効な位置にアクセスするため、i<0アクセスしたくないからです。第 1 オペランドが第 2 オペランドを評価せずに評価されるbuildingnumber[i]ため、正しい方法で無効なアクセスは実行されません。&&falsefalse

一方、他の回答で述べたように、コードは穴list要素を並べ替えず、キーだけを並べ替えます。

さらに、keyおよびi変数は、より小さなブロックで定義できます。

于 2012-11-11T09:17:51.810 に答える
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 に答える