Необходимо написать программу, сортирующую случайный массив следующим способом:

метод является модификацией пузырьковой сортировки и состоит из двух этапов - подъема и спуска. При подъеме последовательно сравниваются соседние элементы 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 ЦИКЛОВ (не условных операторов, а именно циклов), неважно какой длины и каких, но НЕ БОЛЕЕ ДВУХ.


fedorunchik: вот я на си написал, но она почему-то зацикливается, до ответа не доводит
fedorunchik: P.S.: вот фунция swap: void swap (double *a, double *b)
{
int t = *a;
*a = *b;
*b = t;
}
fedorunchik: я вроде также написал, как и на паскале было
BobbyFresnel: А зачем с double писать? Чем int не устроило?
fedorunchik: Ну это не важно, я и с int пробовал - все равно не работает
fedorunchik: А вообще нужно с double, что же тут поделать
BobbyFresnel: Написал в другом таком же вопросе на С++
BobbyFresnel: Проверил, работает
BobbyFresnel: На С не пишу, нас ему не обучали. СС+ и Питон давали обзорно, по 3 лекции, но написать подобную фиговинку этого объема знаний хватает.
BobbyFresnel: Препод сказал, что если знаешь один язык - знаешь их все. Походу он прав.

Ответы

Ответ дал: BobbyFresnel
2

===== PascalABC.NET ======

begin

 var n := ReadInteger('n =');

 var a := ArrRandom(n, -99, 99);

 a.Println;

 var perm := False;

 for var i := 0 to a.High - 1 do

   if a[i] > a[i + 1] then

   begin

     swap(a[i], a[i + 1]);

     var j := i;

     perm := true;

     while perm and (j > 0) do

       if a[j] < a[j - 1] then

       begin

         perm := true;

         swap(a[j], a[j - 1]);

         j -= 1

       end

       else

         perm := false

   end;

 a.Println

end.

Вас заинтересует