У меня есть множество информации о зданиях, и один из предметов — год постройки:
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;
}
}
Размещенный код содержит важную ошибку в
while(buildingnumber[i].yearBuilt > key && i >= 0)
потому что условия должны быть написаны в обратном порядке:
while (i >= 0 && buildingnumber[i].yearBuilt > key)
Причина в том, что когда i<0
Вы не хотите получить доступ buildingnumber[i]
потому что это будет иметь доступ к неверной позиции массива. Так как &&
будет оценивать false
когда первый операнд false
без оценки второго операнда правильным способом недопустимый доступ не выполняется.
С другой стороны, как отмечено в другом ответе, код не упорядочивает дыру list
элементы, просто их ключ.
В дополнение key
а также i
переменные могут быть определены в меньших блоках.
Ваш код сбит с толку. Вы можете написать вид, который просто сравнивает часть чего-то (например, yearBuilt
) но когда вы на самом деле делаете сортировку, вы должны переместить (или поменять местами) весь объект не только ключ.
Таким образом, ваш код может быть улучшен, как это
list b = buildingnumber[j]; // whole building
key = b.yearBuilt;
while (...)
{
...
}
buildingnumber[i+1] = b; // whole building
Не совсем уверен, что теперь код правильный (еще не проверен), но, по крайней мере, вы будете немного ближе.
Другое дело, почему ваш строительный объект называется list
? не было бы Building
быть лучшим именем? В кодовых названиях значение много, и их легко изменить. Если вы можете выбрать подходящие имена для своих типов и переменных, это показывает, что вы четко думаете о проблеме. Не экономьте на этом или думайте, что это не имеет значения.