Как я могу выполнить сортировку по вставке, но проверить свойство элемента в массиве, а не только элемент?
-
16-09-2019 - |
Вопрос
Извините, я уверен, что это просто, но я устал и не могу в этом разобраться.
У меня есть массив элементов, каждый элемент фактически является частицей, которая представляет собой структуру данных (struct в c), содержащую, среди прочего, текущее положение частиц (int x, y, z).Я хочу сравнить положение элементов x, а не только сам элемент.
Глядя на псевдокод в википедии, Я попытался изменить его, чтобы сравнить нужный мне атрибут, но мне кажется, я сделал что-то (вероятно, простое) неправильно.
Вот что я изменил:
for (i = 1; i<length; i++) {
value = particles[i].position.x;
j = i - 1;
while (j >= 0 && particles[j].position.x > value) {
particles[j+1] = particles[j];
j = j - 1;
}
particles[j+1] = particles[i];
}
Если бы кто-нибудь мог указать на мою ошибку, это было бы здорово!
Адам
Решение
Ваша 2-я строка предназначена для хранения временной копии i-го элемента, потому что цикл while перезаписывает его.Тем не менее, во 2-й последней строке вы читаете из перезаписанного значения.Измените свой код на следующий, и он должен работать (изменения прокомментированы):
for (i = 1; i<length; i++) {
value = particles[i]; // store particles[i] rather than it's x coordinate
j = i - 1;
while (j >= 0 && particles[j].position.x > value.position.x) { // changed
particles[j+1] = particles[j];
j = j - 1;
}
particles[j+1] = value; // copy from temporary
}
Другие советы
Вам нужно поменять местами объекты частиц, а не значения координат x.Попробуй:
for (i = 1; i<length; i++) {
value = particles[ i ];
/* ... */