Dutch national flag problem — различия между версиями
Oxygen3 (обсуждение | вклад) (Новая страница: «'''Проблема флага Нидерладндов''' (англ. ''Dutch national flag problem, DNF'') {{---}} задача дискретной матема...») |
м (rollbackEdits.php mass rollback) |
||
(не показаны 2 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
− | ''' | + | '''Задача флага Нидерладндов''' (англ. ''Dutch national flag problem, DNF'') {{---}} задача дискретной математики, которую предложил Эдсгер Дейкстра. Флаг Нидерландов состоит из трех цветов: красного, белого и синего. Получая шары этих трех цветов, расположенных в случайном порядке, задача состоит в том, чтобы организовать их таким образом, что все шары одного цвета были вместе, а и их общие цвета шли в порядке как на данном флаге. |
==Сортировка набора, состоящего из 0 и 1== | ==Сортировка набора, состоящего из 0 и 1== |
Текущая версия на 19:44, 4 сентября 2022
Задача флага Нидерладндов (англ. Dutch national flag problem, DNF) — задача дискретной математики, которую предложил Эдсгер Дейкстра. Флаг Нидерландов состоит из трех цветов: красного, белого и синего. Получая шары этих трех цветов, расположенных в случайном порядке, задача состоит в том, чтобы организовать их таким образом, что все шары одного цвета были вместе, а и их общие цвета шли в порядке как на данном флаге.
Содержание
Сортировка набора, состоящего из 0 и 1
Задача: |
Дан массив | из чисел и . Требуется отелить элементы друг от друга так, чтобы сначала оказались все , а в конце .
Пример
Input array =
Output array =
Алгоритм
Будем поддерживать два указателя. Инициализируем первый индекс
и второй индекс .У будем делать следующее пока
- Увеличиваем на пока не ;
- Уменьшаем на пока не ;
- Если , то меняем местами и , , .
Псевдокод
int left = 1, right = n; while (left < right) while (arr[left] == 0 && left < right) left++ while (arr[right] == 1 && left < right) right-– if (left < right) swap(a[left], a[right]) left++ right–
Сортировка набора, состоящего из 0, 1 и 2
Задача: |
Дан массив | из чисел , и . Требуется отелить их друг от друга так, чтобы сначала шли все , потом все и все в конце.
Пример
Input array =
Output array =
Алгоритм
Будем поддерживать три указателя. Инициализация:
.У будем делать следующее пока
- Если , то меняем местами a[lo] и a[mid], lo++, mid++;
- Если , то mid++;
- Если , то меняем местами a[mid] и a[hi], hi--;
Инвариант работы алгоритма:
- неизвестны
Псевдокод
int lo = 1, mid = 1, hi = n;
while mid
right
switch (a[mid])
case 0:
swap(a[lo++], a[mid++]);
break;
case 1:
mid++;
break;
case 2:
swap(a[mid], a[hi--]);
break;