Итак, у меня проблема с этой функцией сортировки, которую я написал для сортировки 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);
}
i=0
произойдет прямо перед тем, как будет выполняться приращение цикла for, поэтому эффект оператора будет равен i==1
в следующем цикле. Самый простой способ получить ваше намеренное поведение - просто break
из цикла for после того, как вы замените элементы (не волнуйтесь, он только сломает for-loop, а не цикл while). Вы также должны просто установить change=false
в верхней части цикла while, а не устанавливать его, когда вы не меняете элементы.
bool temp=false;
внутри цикла замените любой случай change
на temp
, а в конце цикла установите change=temp
(см. редактирование моего ответа ниже). Но я полагаю, что эффективность вас не касается, иначе вы бы не отклонили <algorithm>
.
Используйте этот код для сортировки (все еще непроверенный):
#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
после обмена.
while(change == true)
. это более читабельно. иchange
не инициализировано, поэтому значение по умолчанию будетfalse