220.01K
Category: programmingprogramming

Сортировка подсчетом

1.

СОРТИРОВКА ПОДСЧЕТОМ
Подсчет – O(n)
0
1
0
A[0]
A[1]
A[2]
0
1
2
4
3
0
1
2
3
4
0
2
1
1
2
2
1
0
0
1
1
1
1
2
2
Заполнение – O(n)
0
0
0
0
1

2.

Сортировка слиянием
Слияние – объединение двух
отсортированных подмассивов в один.
• Средняя оценка временной сложности
n·log2n;
• не зависит от характера входных
данных;
• основной недостаток – необходимость
дополнительного объема памяти;
• устойчивая сортировка.

3.

Сортировка слиянием. Условия примения
• Быстродействие выходит на первое
место
• Легко применяется для структур с
последовательным доступом к данным
• Случай быстро поступающих данных,
когда основной объем данных уже
отсортирован.

4.

Двухпутевое слияние
1
2
3
7
8
0
4
5
Merge(X,F,M,L) начало
Определить массив X1
i=F, j =M, k=0
Пока (i<M и j<=L)
Если X[i]>X[j] то X1[k]=X[j]
j=j+1
k=k+1
6
9

5.

Двухпутевое слияние
Иначе Если (X[j]>X[i]) То X1[k]=X[i]
i=i+1
k=k+1
Иначе X1[k]=X[i]
X1[k+1]=X[j]
k = k+2
i=i+1, j=j+1
кц
Если i<M то дописать элементы
X[i],…X[M-1] в X1

6.

Двухпутевое слияние
Если j<=L то дописать элементы
X[j],…X[L] в X1
Переписать элементы из X1 в X
Конец

7.

Абстрактно-обменное слияние
Недостаток двухпутевого слияния:
отслеживание концов подмассивов
(в цикле пока и после цикла пока)
1
2
3
7
8
0
4
5
6
9
1
2
3
7
8
9
6
5
4
0
X1
F, F+1,F+2,…,M-1
L, L-1,…, M+1, M

8.

Абстрактно-обменное слияние
Merge2(X,F,M,L)
начало
Определить массив X1
Переписать элементы из массива X в
массив X1 по правилу битонной
последовательности
i=0, j = L-F, k=F
Пока (i<=j)
Если X1[i]>X1[j] то X[k]=X1[j]
j=j-1

9.

Абстрактно-обменное слияние
Иначе X[k]=X1[i]
i=i+1
k=k+1
кц
Конец

10.

Нисходящая сортировка слиянием
19
9
10
5
3
2
2
3
1
1
4
2
1
1
5
5
1
2
1
1
1
1
2
3
2
1
2
1
1
1
1
1
1
2
1
1
1

11.

Нисходящая сортировка слиянием
Сортировка Слиянием (Х, F, L)
начало
Если L<=F то выход
M = (L+F)/2
Сортировка Слиянием(Х, F, M)
Сортировка Слиянием(X,M+1,L)
Merge (X,F,M+1,L) (или Merge2)
Конец

12.

Восходящая сортировка слиянием
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2
2
2
2
2
4
4
2
2
4
8
2
4
8
16
19
2
3

13.

Алгоритм восходящей сортировки
слиянием
Для h от 1 до n нц
Для i от 0 до n - h нц
Если (i+2*h-1)<n то
merge(X, i, i+h, i+h*2-1)
иначе
merge(X, i, i+h, n -1)
кц
h =h*2;
кц
конец

14.

Поразрядные сортировки
• Ранее рассматриваемые сортировки
применялись к числовым данным.
• Наиболее часто сортировки применяются к
ключам.
• Природа ключей может быть очень сложной.
• Очевидно, что на каждом шаге не
обязательно обрабатывать весь ключ.
• Например – поиск книги по фамилии автора в
каталоге библиотеки

15.

Поразрядные сортировки
• Для того, чтобы сортировка была такой
же эффективной, будем рассматривать
ключи, как последовательности.
• Строки – последовательности символов.
• Двоичные числа – последовательности
битов.
• Десятичные числа –
последовательности цифр

16.

Поразрядные сортировки
• Каждый элемент последовательности
имеет строго определенный размер.
• Сортировки, основанные на обработке
за раз одного такого элемента
называются поразрядными (radix).
• Например: сортировка карточек
абонентов библиотеки.

17.

Поразрядные сортировки
Сафронов
Стариков
Федоров
Кондратов
Климачев
Плотников
Трубин
Гейвус
Горецкий
Гусаченко
Гусев
Пример поразрядной сортировки с R= 29

18.

Поразрядные сортировки
Алгоритмы поразрядной сортировки
рассматривают ключи сортировки как числа,
представленные в системе счисления по
основанию R и работают с различными
значениями R.
Ключи-строки – основание 256 (ASCII).
Целые числа – основание 10.
Двоичные числа – основание 2 и т.д..

19.

Поразрядные сортировки
Основа всех типов поразрядных
сортировок - операция извлечения из
ключа I - той цифры (символа).
Реализация извлечения в Си
R = 10 (при условии, что ключи состоят из
одинакового количества цифр n)
int x = …, i,p, n = …, R=10, k=1;
for(i=0;i<n;i++){ p=(x/k)%R; k*=10;
printf("%d ",p); }

20.

Реализация извлечения в Си
R = 10 ( при условии, что длина ключей не
фиксирована )
int x = …, i, p, R=10, k=1;
while (x>0){ p=x%R;
x = x/R;
printf("%d ",p); }
Строки символов – обращение по индексу
x[i]

21.

Реализация извлечения в Си
R=2
int i, p;
unsigned int y = …,y1;
for(i=0;i<sizeof(y)*8;i++){
y1=y>>i; // сдвиг вправо
p=y1&1; // наложение маски
printf("%d",p); }

22.

Типы поразрядных сортировок
Двоичная быстрая сортировка
‘a’ 1100001
‘e’ 1100101
‘b’ 1100010
‘f’ 1100110
‘c’ 1100011
‘g’ 1100111
‘d’ 1100100
‘h’ 1101000
Последовательность e f d e c g h d a e

23.

Двоичная быстрая сортировка
1100101 e
1100101 e
1100001 a
1100110 f
1100110 f
1100011 c
1100100 d
1100100 d
1100100 d
1100101 e
1100101 e
1100101 e
1100011 c
1100011 c
1100110 f
1100111 g
1100111 g
1100111 g
1101000 h
1100101 e
1100101 e
1100100 d
1100100 d
1100100 d
1100001 a
1100001 a
1100101 e
1100101 e
1101000 h
1101000 h

24.

Двоичная быстрая сортировка
1100001 a
1100001 a
1100001 a
1100011 c
1100011 c
1100011 c
1100100 d
1100100 d
1100100 d
1100101 e
1100101 e
1100100 d
1100110 f
1100101 e
1100101 e
1100111 g
1100100 d
1100101 e
1100101 e
1100101 e
1100101 e
1100100 d
1100111 g
1100110 f
1100101 e
1100110 f
1100111 g
1101000 h
1101000 h
1101000 h

25.

Двоичная быстрая сортировка
efdecghdae
efdecgeda
defgede
ac
deede
gf
dd
f
eee
g
h

26.

Двоичная быстрая сортировка
Radix_bin(X,F,L,d) // X – массив, F, L – начало и
конец подмассива, d – номер
рассматриваемого разряда
Если d<0 или F==L то выход
I=F, J = L
пока I< J нц
пока бит d в X[I] == 0
нц I++ кц
пока бит d в Х[J] == 1
нц J-- кц

27.

Двоичная быстрая сортировка
Если I<=J то поменять местами x[I] и x[J]
кц
Radix_bin(X,F,J,d-1)
Radix_bin(X,I,L,d-1)
конец

28.

Поразрядная MSD - сортировка
Most Significant Digit radix sort –
поразрядная сортировка сначала по
старшей цифре.
• обобщает понятие поразрядной
сортировки по произвольному
основанию R;
• производит разделение всего
массива на R подмассивов;

29.

Поразрядная MSD - сортировка
.3452876
.0234567
.0234567
.5428764
.0278564
.0278564
.0234567
.1098754
.1098754
.1098754
.2894561
.2894561
.0278564
.3452876
.3452876
.5462376
.5428764
.5428764
.2894561
.5462376
.5462376
7
4
4
15

30.

Поразрядная MSD - сортировка
Msd_Sort(X,F,L,d)
Если d<0 или F>L то выход
Сортировать X по разряду d
Cформировать массив точек
разделения отсортированного
массива X – r[R+1]
Для i=0 до R нц
Msd_Sort(X, r[i], r[i+1]-1, d-1) кц
конец

31.

Поразрядная MSD - сортировка
• В качестве сортировки внутри разряда
может использоваться сортировка
подсчетом
• Можно определить вспомогательный
массив c, в i -том элементе которого
сохраняется количество элементов
массива, разряд d которых равен i.
• Для перестановки элементов массива
можно использовать еще один массив p,
элементы которого формируются по
правилу p[0]=c[0], p[i ]=p[i-1]+c[i ]

32.

Поразрядная MSD - сортировка
• Далее просматривается основной массив
– если первая цифра i, то выставляем
элемент d (p[i] -1) позицию, p[i]=p[i]-1.
Например:
8467 6334 6500 9169 5724 1478 9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604
С
p
0
1
2
3
4
5
6
7
8
9
0
2
2
1
3
3
4
0
2
3
0
1
2
3
4
5
6
7
8
9
0
2
4
5
8
11 15 15 17 20

33.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
2
4
5
8
11 15 15 17 20
8467
8467 6334 6500 9169 5724 1478 9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

34.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
2
4
5
8
11 15 15 16 20
6334
8467
6334 6500 9169 5724 1478 9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

35.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
0
2
4
5
8
11 14 15 16 20
6500
7
8
9
6334
8467
6500 9169 5724 1478 9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

36.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
0
2
4
5
8
11 13 15 16 20
6500
8467
7
8
9
6334
9169
9169 5724 1478 9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

37.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
0
2
4
5
8
11 13 15 16 19
5724
6
6500
8467
7
8
9
6334
9169
5724 1478 9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

38.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
2
4
5
8
10 13 15 16 19
1478
5724
6500
8467
6334
9169
1478 9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

39.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
1
4
5
8
10 13 15 16 19
1478
5724
8467
6500
6334
9358
9169
9358 6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

40.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
1
4
5
8
10 13 15 16 18
1478
5724
6962
8467
6500
6334
9358
9169
6962
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

41.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
1
4
5
8
10 12 15 16 18
1478
4464
5724
6962
8467
6500
6334
9358
9169
4464 5705 8145 3281 6827 9961 2995 1942
4827 5436 2391 4604

42.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
1
4
5
7
10 12 15 16 18
1478
4464
5724
6962
8467
5705
6500
6334
9358
9169
5705 8145 3281 6827 9961 2995 1942 4827
5436 2391 4604

43.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
1
4
5
7
9
12 15 16 18
1478
4464
5724
8145
6962
8467
5705
6500
6334
9358
9169
8145 3281 6827 9961 2995 1942 4827 5436
2391 4604

44.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
0
1
4
5
7
9
12 15 15 18
1478
8145
6962
8467
8
9
3281
4464
5724
7
5705
6500
6334
9358
9169
3281 6827 9961 2995 1942 4827 5436 2391
4604

45.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
0
1
4
4
7
9
12 15 15 18
1478
6827
8145
8467
8
9
3281
4464
5724
7
6962
5705
6500
6334
9358
9169
6827 9961 2995 1942 4827 5436 2391 4604

46.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
0
1
4
4
7
9
11 15 15 18
1478
7
8
9
3281
4464
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
9961 2995 1942 4827 5436 2391 4604

47.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
0
1
4
4
7
9
11 15 15 17
1478
2995
4464
7
8
9
3281
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
2995 1942 4827 5436 2391 4604

48.

Поразрядная MSD - сортировка
p
1942
0
1
2
3
4
5
6
0
1
3
4
7
9
11 15 15 17
1478
7
2995
4464
8
9
3281
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
1942 4827 5436 2391 4604

49.

Поразрядная MSD - сортировка
p
1942
0
1
2
3
4
5
6
0
0
3
4
7
9
11 15 15 17
1478
2995
7
8
9
3281
4827
4464
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
4827 5436 2391 4604

50.

Поразрядная MSD - сортировка
p
1942
0
1
2
3
4
5
6
0
0
3
4
6
9
11 15 15 17
1478
7
8
9
2995
3281
4827
4464
5436
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
5436 2391 4604

51.

Поразрядная MSD - сортировка
p
1942
0
1
2
3
4
5
6
7
8
9
0
0
3
4
6
8
11 15 15 17
1478
2391
2995
3281
4827
4464
5436
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
2391 4604

52.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
0
2
4
6
8
11 15 15 17
1942
1478
2391
2995
3281
4604
4827
4464
5436
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
4604

53.

Поразрядная MSD - сортировка
p
0
1
2
3
4
5
6
7
8
9
0
0
2
4
5
8
11 15 15 17
1942
1478
2391
2995
3281
4604
4827
4464
5436
5705
5724
6827
6962
6500
6334
8145
8467
9961
9358
9169
English     Русский Rules