Сортировка вставок, чтобы сделать «год» из 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;
}
}

0

Решение

Размещенный код содержит важную ошибку в

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

потому что условия должны быть написаны в обратном порядке:

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

Причина в том, что когда i<0Вы не хотите получить доступ buildingnumber[i] потому что это будет иметь доступ к неверной позиции массива. Так как && будет оценивать false когда первый операнд false без оценки второго операнда правильным способом недопустимый доступ не выполняется.

С другой стороны, как отмечено в другом ответе, код не упорядочивает дыру list элементы, просто их ключ.

В дополнение key а также i переменные могут быть определены в меньших блоках.

0

Другие решения

Ваш код сбит с толку. Вы можете написать вид, который просто сравнивает часть чего-то (например, yearBuilt) но когда вы на самом деле делаете сортировку, вы должны переместить (или поменять местами) весь объект не только ключ.

Таким образом, ваш код может быть улучшен, как это

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

Не совсем уверен, что теперь код правильный (еще не проверен), но, по крайней мере, вы будете немного ближе.

Другое дело, почему ваш строительный объект называется list? не было бы Building быть лучшим именем? В кодовых названиях значение много, и их легко изменить. Если вы можете выбрать подходящие имена для своих типов и переменных, это показывает, что вы четко думаете о проблеме. Не экономьте на этом или думайте, что это не имеет значения.

0

По вопросам рекламы [email protected]