Re: сортировка почти отсортированных данных
- From
- Vladimir A. Pertzel ()
- To
- Max Alekseyev
- Date
- 2002-07-17T11:27:44Z
- Area
- RU.ALGORITHMS
From: "Vladimir A. Pertzel" <voldemar@relhum.org>
Мир Вашему Дому!
"Max Alekseyev" > news:1026764972@f60.n5015.z2.ftn ...
> Предположим, что массив данных размерности n является почти
отсортированным
> (чтобы формализовать это понятие, скажем, достаточно не более
log(n)
> элементарных операций для получения из него отсортированного
массива). Какие
> есть алгоритмы для быстрой сортировки таких массивов? Хотелось
бы линейного
> времени, а лучше саб-линейного.
Требуемое время не менее линейного, поскольку если мы
не узнавали значения некоторого элемента, то в ситуации,
когда он стоит не на своем месте, задача окажется
нерешенной.
Однако, прежде всего, хотелось бы понять, минимальным должно
быть "среднее" время сортировки или гарантированный результат?
Вот решение с двунаправленными сортированными списками:
Создаем список списков и инициируем его исходным.
Исходный список объявляем текущим списком.
Его элемент, что находится с того конца, где предполагаются
минимальные элементы, объявляем текущим элементом списка.
Двигаемся в сторону предполагаемого возрастания. Цикл: {
Как только следующий элемент Y оказывается меньше
предыдущего Z, разрываем текущий список по связке
между ними, и хвост объявляем началом нового текущего
(заметим, что хотя бы один из элементов Y и Z стоит
не на своем месте, поэтому списков не более 2*log(n))
}
Создаем из минимальных элементов списков priority queue,
в качестве приоритета используя убывание. Цикл по ней: {
Извлекаем из priority queue список, объявляем его
текущим. Список, оказавшийся в начале очереди объявляем
списком-кандидатом, а минимальный элемент списка-кандидата
объявляем элементом-кандидатом. Цикл по текущему списку,
двигаемся в сторону возрастания: {
Если текущий элемент меньше элемента-кандидата,
вставляем его в итоговый список,
(всего эта операция будет выполнена ровно n раз)
иначе
возвращаем текуший список в priority queue и выходим
из цикла по текущему списку. (поскольку либо
элемент-кандидат,
либо текущий элемент стояли не на своем месте, всего эта
операция будет выполнена не более (2*log(n) раз)
}
}
--
/\ /\ С почти африканским приветом,
((ovo)) Владимир Анатольевич Перцель
():::() http://voldemar.relhum.org
--PVA---------------------------------------
Блаженны умеющие смеяться над собой, ибо не
иссякнет источник их услады до конца дней их.
--- ifmail v.2.15dev5
* Origin: Sent via Graf's Inn at news://news.relhum.org (2:5020/400)