Как я могу выполнить вставку сортировки, но проверить свойство элемента в массиве, а не только элемент? - PullRequest
0 голосов
/ 26 апреля 2009

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

У меня есть массив элементов, каждый элемент на самом деле является частицей, которая представляет собой структуру данных (структуру в 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 ]

4 голосов
/ 26 апреля 2009

Ваша вторая строка действует для хранения временной копии i-го элемента, потому что цикл while перезаписывает его. Тем не менее, в вашей второй последней строке вы читаете из перезаписанного значения. Измените свой код на следующий, и он должен работать (изменения прокомментированы):

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
}
1 голос
/ 26 апреля 2009

Вам необходимо поменять объекты частиц, а не значения координат х. Попробуйте:

 for (i = 1; i<length; i++) {
    value = particles[ i ];
    /* ... */
...