пользовательская функция сортировки со структурой

0

Итак, у меня проблема с этой функцией сортировки, которую я написал для сортировки struct.

Моя первая мысль была иметь while цикл, пока не будет никаких изменений происходит, и внутри есть for цикла, который проходит через array[10], сравнивая два элемента, которые находятся рядом друг с другом. Если следующий элемент больше предыдущего, они обмениваются, и итератор возвращается к нулю.

Все виды работ, за исключением первого элемента, который не самый высокий. От второго до последнего все в порядке.

Любые указатели, где я совершил ошибку? Код мне кажется прекрасным... Я знаю, что мог бы использовать <algorithm>, но я должен написать свою собственную функцию для этого.

void izvadaPecRez(Pari masivs[])
{
    Pari temp;
    bool change;
    int i;
    while(change!=false)
    {
        for(i=0;i<10;i++)
        {
            if(masivs[i+1].kopejais>masivs[i].kopejais)
            {
                temp=masivs[i];
                masivs[i]=masivs[i+1];
                masivs[i+1]=temp;
                change=true;
                i=0;
            }
            else
            {
                change=false;
            }
        }
    }

    for(i=0;i<10;i++)
        printone(masivs, i);
}
  • 0
    Вы жестко программируете количество объектов? Не.
  • 0
    Вы можете написать `while (change! = False)` as while(change == true) . это более читабельно. и change не инициализировано, поэтому значение по умолчанию будет false
Показать ещё 3 комментария
Теги:
struct
sorting

2 ответа

1
Лучший ответ

i=0 произойдет прямо перед тем, как будет выполняться приращение цикла for, поэтому эффект оператора будет равен i==1 в следующем цикле. Самый простой способ получить ваше намеренное поведение - просто break из цикла for после того, как вы замените элементы (не волнуйтесь, он только сломает for-loop, а не цикл while). Вы также должны просто установить change=false в верхней части цикла while, а не устанавливать его, когда вы не меняете элементы.

  • 0
    Спасибо, перерыв после свопа сработал отлично.
  • 0
    @ user3665674: Вы должны знать, однако, что прерывание после свопинга в целом приводит к снижению производительности ... во избежание просто вставьте еще один логический bool temp=false; внутри цикла замените любой случай change на temp , а в конце цикла установите change=temp (см. редактирование моего ответа ниже). Но я полагаю, что эффективность вас не касается, иначе вы бы не отклонили <algorithm> .
0

Используйте этот код для сортировки (все еще непроверенный):

#include<array>
#include<functional>
#include<algorithm>

std::array<Pari,100> masivs;
auto compare=[](const Pari& a, const Pari& b) {return a.kopejais<b.kopejais;};
std::sort(masivs.begin(), masivs.end(), compare);

Здесь вместо обычного массива используется std::array. Затем настраивается пользовательская функция lambda-функции сравнения и передается в std::sort.

Я не знаю, делает ли он точно так же, как ваш код, но по крайней мере будет сортировать ваши классы в соответствии с входом kopejais.


EDIT: Вот версия вашего кода, которая должна работать быстрее, чем в принятом ответе:

void izvadaPecRez(Pari masivs[])
{
    bool change=true;
    while(change==true)
    {
        change=false;
        for(int i=0;i<10;i++)
        {
            if(masivs[i+1].kopejais > masivs[i].kopejais)
            {
                std::swap(masivs[i], masivs[i+1]);
                change=true;
            }
        }
    };

    for(i=0;i<10;i++)
        printone(masivs, i);
}

Причина в том, что вы не повторяете цикл по уже упорядоченным частям массива, что делается путем использования break после обмена.

  • 0
    Quoth the OP: «Я знаю, что мог бы использовать <алгоритм>, но я должен написать свою собственную функцию для этого».
  • 0
    перечитайте это, спасибо за указание на это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню