// входной массив положим здесь, непринципиально
int Inp_ar[] = {10, 7, 0, 13, 1, 24, 17, 19, 44, 3};
void setup() {
// put your setup code here, to run once:
// Инициализируем интерфейс
Serial.begin(9600);
}
// Опять ардуино в роли С-компьютера ;-)
void loop() {
// put your main code here, to run repeatedly:
// Посчитаем размер входного массива и забронируем резервный массив
int Num = sizeof(Inp_ar)/sizeof(Inp_ar[0]);
int Res_ar[Num];
// Это распечатка входного массива
Pr_ar(Inp_ar,Num);
// заполнение резервного массива из входного
for (int i = 0; i < Num; i++)
{
Res_ar[i] = Inp_ar[i];
}
// Пузырьковая сортировка, результат - количество операций
int Iter = Bubbl_fun(Res_ar,Num);
// Число итераций запишем
Serial.println("Number of iterations: "+String(Iter));
// Отдохнем немного
delay(5000);
}
// функция пузырьковой сортировки
int Bubbl_fun(int Arg[], int Number)
{
// Инициализация переменных
int Result = 0;
bool Good = false;
// Первичная распечатка массива (получается две, можно где нибудь убрать)
Pr_ar(Arg,Number);
// возьмем do, хотя бы один прогон состоится
do
{
for (int i = 0; i < Number-1; i++)
{
// почти для каждого сравним с последующим, если больше обменяем
if (Arg[i] > Arg[i+1])
{
int c = Arg[i+1];
Arg[i+1] = Arg[i];
Arg[i] = c;
}
// в результате большие поползут вправо, меньшие - влево
}
// Распечатка результатов прохода - номер шага и получившийся массив
Result++;
Serial.println("Step "+String(Result));
Pr_ar(Arg,Number);
// Проверка количества перепутанных элементов
// Если хотя бы один перепутан - еще итерация
int Dop = 0;
for (int i = 0; i < Number-1; i++)
{
if (Arg[i] > Arg[i+1])
{
Dop ++;
}
}
// Если все выровнялись - выходим и отдаем результат
if (Dop == 0)
{
Good = true;
}
}
while (!Good);
return Result;
}
// функция распечатки массива
void Pr_ar(int Argum[], int Numb)
{
for (int count = 0; count < Numb; count ++)
{
Serial.print(String(Argum[count])+" ");
}
Serial.println(" ");
}