Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных / методичка структуры данных_задания.docx
Скачиваний:
54
Добавлен:
12.05.2015
Размер:
381.84 Кб
Скачать

1.1.5. Швидке сортування

Алгоритм сортування:

Вибирається елемент x приблизно посередині. Переглядається масив зліва направо, поки не зустрінеться елемент a[i]>x, а потім справа наліво, поки не зустрінеться елемент a[j]<x. Елементи a[i] та a[j] міняються місцями, поки i та j не зустрі­нуться.

  1. 55 12 42 94 06 18 67

18 06 12 42 94 55 44 67

В результаті ми отримали два підмасиви: зліва елементи з меншими ключами, справа — з більшими відносно елемента з ключем 42.

a[k].key <= x.key для k=1,...,i–1 a[k].key >= x.key для k=j+1,...,n

Тепер необхідно зробити те саме з обома отриманими частинами масиву, частинами частин і т.д., поки кожна частина не буде містити в собі тільки один елемент.

Procedure QuickSort;

Procedure Sort (left, right: index);

Var

i,j : index;

x,w : item;

Begin

i:=left;

j:=right;

x:=a[(left+right) div 2];

Repeat

While a[i].key < x.key Do i:=i+1;

While a[j].key > x.key Do j:=j–1;

If i<=j Then

Begin

w:=a[j];

a[i]:=a[j];

a[j]:=w;

i:=i+1;

j:=j–1

End

Until i>j;

If left<j Then Sort(left,j);

If i<right Then Sort(i,right)

End;

Begin

Sort(1,n);

End;

Цей алгоритм дуже простий та ефективний, часто використовується професійними програмістами.

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

При розробці технологічних процесів обробки великих об’ємів інформації необхідно враховувати, що найбільш ефективні методи пошуку працюють тільки на впорядкованих наборах даних. Якщо передбачається пошук у великому наборі даних, цей набір необхідно спочатку відсортувати.

1.2. Сортування масива рядків

Сортування рядків — це впорядкування даних рядкового типу за алфавітом (фактично за номером символів, що складають рядок, у кодовій таблиці). Сортування рядків виконується при виведенні списків (за прізвищами, за назвами), імен файлів при роботі з директорієм і т.ін.

Порівняння рядків здійснюється зліва направо до першого незбіжного символу, і той рядок вважають більшим, в якому перший незбіжний символ має більший номер у стандартній таблиці кодів:

‘Іванчук’ > ’Іванченко’

З двох збіжних за символами рядків різної довжини меншим є коротший: ’ABR’ < ’ABRAKAD’

Розглянемо приклад. У прикладі дані вводяться з клавіатури, але на практиці краще дані зберігати у файлі на диску.

Для сортування використовуємо метод швидкого сортування.

Процедура сортування рядкiв має вигляд:

Procedure SortString (Var inm:StringArray; n:Integer);

{StringArray – масив рядків, n– кількість рядків}

Procedure InSort (left,right:Integer; Var m:StringArray);

Var

a,b : InData;

i,j : Integer;

Begin

i:=left;

j:=right;

a:= m[(left + right) div 2];

Repeat

While m[i] < a Do i:=i+1;

While a < m[j] Do j:=j–1;

If i<=j Then

Begin

b:=m[i];

m[i]:=m[j];

m[j]:=b;

i:=i+1;

j:=j–1

End

Until i>j;

If left<j Then InSort (left,j,m);

If i<right Then InSort (i,right,m);

End;

Begin

InSort (1,n,inm);

End;