Как я могу выполнить сортировку по вставке, но проверить свойство элемента в массиве, а не только элемент?

StackOverflow https://stackoverflow.com/questions/789773

Вопрос

Извините, я уверен, что это просто, но я устал и не могу в этом разобраться.

У меня есть массив элементов, каждый элемент фактически является частицей, которая представляет собой структуру данных (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 ];
    /* ... */
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top