Сортування змішуванням

Сортування змішуванням (cocktail sort, shaker sort), або шейкерне сортування - вдосконалений різновид сортування методом бульбашки, при якому сортування проводиться у двох напрямках, змінюючи напрям при кожному проході.

Аналізуючи алгоритм сортування бульбашкою, можна помітити:

  • якщо при обході частини масиву не відбувається обмін елементів, то цю область можна виключити, так як вона вже відсортована;
  • при проході від кінця масиву до початку, мінімальне значення зміщується на першу позицію, при цьому максимальний елемент переміщається тільки на один індекс вправо.

Виходячи з наведених ідей, модифікуємо сортування бульбашкою наступним чином:

  • на кожній ітерації, фіксуємо межі області масиву в якій відбувається обмін;
  • пробігаємо масив по черзі від початку до кінця, та від кінця до мочатку.

Таким чином, ми переміщаємо мінімальний елемент на початок масиву, а максимальний - в кінець, після відкидаємо індекси цих елементів, цим самим - зменшуємо робочу область. Таким чином, за кожну ітерацію невідсортована частина зменшується на два елементи.

Візуалізація алгоритму сортування змішуванням

Реалізація алгоритму

{$CODEPAGE UTF8}
program CocktailSort;
const
  arrayLength = 10;
var
  inputArray : array [1..arrayLength] of integer;
  i, tempValue: integer;
  firstIndex, lastIndex : integer;
begin
  randomize;
  writeln ('Вхідний масив: ');
  {заповнюємо масив випадковими числами}
  for i := 1 to arrayLength do
  begin
    inputArray[i] := random(100);
    write (inputArray[i]:4);
  end;
  writeln;

  {Шейкерне сортування}

  firstIndex := 1;          {індекс першого елемента робочої зони масива}
  lastIndex := arrayLength; {індекс останнього елемента робочої зони масиву}

  while firstIndex < lastIndex do
  begin
    {прохід від початку до кінця} 
    for i:= firstIndex to lastIndex-1 do
      if inputArray[i] > inputArray[i+1] then
      begin
        {обмін}
        tempValue := inputArray[i];
        inputArray[i] := inputArray[i+1];
        inputArray[i+1] := tempValue;
      end;

    {прохід від кінця до початку}
    for i:= lastIndex downto firstIndex+1 do
      if inputArray[i] < inputArray[i-1] then
      begin
        {обмін елементів}
        tempValue := inputArray[i];
        inputArray[i] := inputArray[i-1];
        inputArray[i-1] := tempValue;
      end;

    {зменшуємо робочу область}  
    firstIndex := firstIndex + 1;
    lastIndex := lastIndex - 1;
  end;

  writeln ('Відсортований масив: ');
  for i := 1 to arrayLength do
    write (inputArray[i]:4);
  readln;
end.

Результат роботи програми сортування змішуванням:

В наведеній програмі дані сортуються за зростанням, для сортування по спаданню, необхідно замінити оператори порівняння в рядках програми:
if inputArray[i] > inputArray[i+1] then, з більше - “>” на менше - “<”
if inputArray[i] < inputArray[i-1] then, з менше - “<” на більше - “>”

Дивіться також: