Необходимо написать программу, сортирующую случайный массив следующим способом:
метод является модификацией пузырьковой сортировки и состоит из двух этапов - подъема и спуска. При подъеме последовательно сравниваются соседние элементы a[i] и a[i+1] до тех пор, пока не будет сделана первая перестановка. Пусть эта перестановка затронула элементы a[k] и a[k+1] . Следующим этапом является спуск. Новый элемент a[k] сравниваются с a[k−1] и если a[k] < a[k−1] , то выполняется перестановка. Сравнение продолжается в нисходящем направлении (т.е. для a[k−1] и a[k−2] , a[k−2] и a[k−3] и т.д.) до тех пор, пока выполняются перестановки либо достигается начало массива.
После этого возобновляется подъем с позиции i = k+1. Таким образом,
сортировка состоит из сменяющих друг друга процессов подъема (до
первой перестановки) и спуска (до первого отсутствия перестановки) до тех пор, пока при подъеме не будет затронут последний элемент
массива a[n−1] (при этом спуск также должен быть выполнен).
Помогите, пожалуйста, написать именно в соответствии с этим условием, язык: питон / паскаль ABC, ну главное здесь - алгоритм нужен понятный. ВАЖНО: ДОЛЖНО БЫТЬ НЕ БОЛЕЕ 2 ЦИКЛОВ (не условных операторов, а именно циклов), неважно какой длины и каких, но НЕ БОЛЕЕ ДВУХ.
Ответы
===== С++ 17 =====
#include <iostream>
using namespace std;
void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int n;
cin >> n;
int a[n];
srand(time(NULL));
for(int i = 0; i < n; i++)
{
a[i] = rand() % 198 - 99;
cout << a[i] << " ";
}
cout << endl;
bool perm = false;
int j;
for(int i = 0; i < n - 1; i++)
{
if(a[i] > a[i + 1])
{
swap(a[i], a[i + 1]);
j = i;
perm = true;
while(perm && (j > 0))
if(a[j] < a[j - 1])
{
perm = true;
swap(a[j], a[j - 1]);
j--;
}
else perm = false;
}
}
for(int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}