Сортировки
Задача
Применение сортировок
Виды сортировок
Алгоритмы
Пузырьковая сортировка
Пузырьковая сортировка
Сортировка выбором
Сортировка выбором
Сортировка вставками
Сортировка вставками
Сортировка подсчётом
Сортировка подсчётом
Поразрядная сортировка
Быстрая сортировка
Быстрая сортировка
Сравнение сортировок
Сравнение сортировок
STL C++
1.27M
Категория: ПрограммированиеПрограммирование

Сортировки. Задача сортировки

1. Сортировки

2. Задача

Задача сортировки – упорядочивание элементов
списка в необходимом порядке.
7
10
13
12
9
11
1
8
5
2
4
6
3
1
2
3
4
5
6
7
8
9
10
11
12
13

3. Применение сортировок

Бинарный поиск
Проверка уникальности, удаление
повторяющихся элементов
Поиск k-того по величине элемента
Расчёт частоты появления элемента
И т. д.

4. Виды сортировок

Внутренние – работают с массивами в оперативной
памяти.
Внешние – работают с файлами в файловой
системе.
Устойчивая

не
изменяет
взаимного
расположения элементов с одинаковыми ключами.
Неустойчивая – изменяет.
Кроме того, сортировки могут быть основанными на
сравнениях или не на сравнениях.

5. Алгоритмы

• Пузырьковая
• Выбором
• Вставками
• Подсчётом
• Поразрядная
• Быстрая

6. Пузырьковая сортировка

Вычислительная сложность: O(n2)
Размер
массива
Итераций
Время
работы, сек.
10
63
0
100
9405
0
1000
943056
0.003
6000
10000
99160083
0.430
4000
100000
9936100638
47.5491
2000
200000
39928000359
207.359
1000000
999047000952
4739.26
Время, сек
bubble
0
0
500000 1000000 1500000
Размер массива

7. Пузырьковая сортировка

void bubble_sort(int* array, int N) {
int buffer;
bool flag=true;
while (flag) {
flag=false;
for (int i=1;i<N;i++){
if (array[i]<array[i-1]) {
buffer=array[i];
array[i]=array[i-1];
array[i-1]=buffer;
flag=true;
}}}}

8. Сортировка выбором

Вычислительная сложность: O(n2)
selection
1500
1000
500
0
0
500000
1000000 1500000
Размер
массива
Итераций
Время
работы, сек.
10
45
0
100
4950
0
1000
499500
0.001
10000
49995000
0.127
100000
4999950000
12.340
200000
19999900000
46.434
1000000
499999500000
1206.53

9. Сортировка выбором

void selection_sort(int *array, unsigned int N){
for (unsigned int i=0;i<N;i++){
unsigned int min=i;
for (unsigned int j=i+1;j<N;j++){
if (array[j]<array[min])
min=j;
it++;
}
if (min!=i)
swap(array[min],array[i]);
}}

10. Сортировка вставками

Вычислительная сложность: O(n2)
Размер
массива
Итераций
Время
работы, сек.
10
21
0
800
100
2619
0
600
1000
244576
0.0009
400
10000
25188102
0.091
200
100000
2494480444
7.548
0
200000
9989335701
29.930
1000000
249835192276
745.559
insert
0
500000
1000000 1500000

11. Сортировка вставками

void insert_sort(int *array, unsigned int N){
for (unsigned int i=1;i<N;i++){
unsigned int j=i;
while ((j>0)&& (array[j-1]>array[j])){
if (j==0)
break;
swap(array[j],array[j-1]);
j--;
}}}

12. Сортировка подсчётом

Вычислительная сложность: O(N)
counting
0,04
0,03
0,02
0,01
0
0
500000
1000000 1500000
Размер
массива
Итераций
Время
работы, сек.
10
29
0
100
299
0
1000
2999
0
10000
29999
0
100000
299999
0.001
200000
599999
0.005
1000000
2999999
0.031

13. Сортировка подсчётом

void count_sort(int *array, int N, int K){
int *c=new int [K];
for (int i=0;i<K;i++)
c[i]=0;
for (int i=0;i<N;i++)
c[array[i]]=c[array[i]]+1;
for (int j=1;j<K;j++)
c[j]+=c[j-1];
int *b=new int[N];
for (int i=N-1;i>=0;i--){
c[array[i]]--;
b[c[array[i]]]=array[i];}
for (int i=0;i<N;i++)
array[i]=b[i];}

14. Поразрядная сортировка

Идея сортировки:
Вычислительная сложность: O(kn)
массив чисел последовательно
сортируется по его разрядам.
Размер
массива
Итераций
Время
работы, сек.
10
40
0
10000
40000
0.0004
1000000
40000000
0.05
radix
0,06
0,04
0,02
0
0
500000 1000000 1500000

15. Быстрая сортировка

Вычислительная сложность: O(NlogN)
Размер
массива
Итераций
Время
работы, сек.
10
23
0
100
416
0
0,2
1000
5572
0
0,15
10000
71687
0.0009
0,1
100000
892421
0.016
0,05
200000
1923618
0.026
1000000
11554921
0.144
quick
0
0
500000
1000000 1500000

16. Быстрая сортировка

void quickSortR(int* a, int N) {
int i = 0, j = N-1;
int temp, p;
p = a[N>>1];
do{
while ( a[i] < p ) i++;
while ( a[j] > p ) j--;
if (i <= j)
{
temp = a[i]; a[i] = a[j]; a[j] = temp;
i++; j--;
}
it++;
}while(i<=j);
if ( j > 0 ) it+=quickSortR(a, j+1);
if ( N-1 > i )it+= quickSortR(a+i, N-i);
}

17. Сравнение сортировок

sorts
5000
4000
3000
2000
1000
0
0
200000
selection
400000
bubble
600000
insert
800000
radix
1000000
quick
1200000

18. Сравнение сортировок

Название
Пузырьковая
Выбором
Вставками
Подсчётом
Поразрядная
Быстрая
Сложность
O(N2)
O(N2)
O(N2)
O(N)
O(N)
O(NlogN)
Память
O(1)
O(1)
O(N)
O(N)
O(N)
O(logN)
Время
4739.26
1206.53
745.559
0.031
0.05
0.144

19. STL C++

• qsort
– быстрая сортировка из STL;
• qsort_s
– устойчивая версия;
• nth_elementh
элемента;
• uniquie
• sort
– поиск k-того по величине
– удаление повторов в массиве;
– быстрая сортировка из библиотеки C;
English     Русский Правила