Шейкерная сортировка

    Предположим, мы упорядочиваем массив в порядке возрастания. После первого прохода "Пузырьком", самый большой элемент массива встанет на свое место. Выполним второй проход наоборот, от предпоследнего элемента до первого. После этого прохода встанет на свое место самый маленький элемент. Так и будем выполнять наши проходы массива: нечетные слева - направо и четные справа - налево. При этом на нечетных проходах будет занимать свое место самый большой элемент (из оставшихся), а при нечетных самый маленький (также из оставшихся). 

 

Алгоритм

Левая граница = Номер первого элемента

Правая граница = Номер последнего элемента 

Пока Левая граница < Правой границы делать

    Прямой проход "Пузырька" от Левой границы до Правой-1 

    Правая граница = Правая граница - 1

    Обратный проход "Пузырька" от Правой границы до Левой+1

    Левая граница = Левая граница + 1  

 Текст программы

MODULE example;

    IMPORT In, StdLog;

PROCEDURE Sort*;

    VAR

        a:ARRAY 100 OF INTEGER;

        i,n,R,L,c:INTEGER;

BEGIN

    n:=-1;

    In.Open;

    REPEAT

        n:=n+1;

        In.Int(a[n]);

    UNTIL ~In.Done;

    L:=0;R:=n-1;

    WHILE L<R DO

        FOR i:=L TO R-1 DO

            IF a[i]>a[i+1] THEN

                c:=a[i];a[i]:=a[i+1];a[i+1]:=c;

            END;

        END;

        R:=R-1;

        FOR i:=R TO L+1 BY -1 DO

            IF a[i]<a[i-1] THEN

                c:=a[i];a[i]:=a[i-1];a[i-1]:=c;

            END;

        END;

        L:=L+1;

    END;

    FOR i:=0 TO n-1 DO

        StdLog.Int(a[i]);

    END;

END Sort;

END example.

 

 

Hosted by uCoz