Исследование алгоритма сортировки методом Шелла. |
Автор megabax | ||||||||
03.01.2013 г. | ||||||||
Исследование алгоритма сортировки методом Шелла.Это последний урок из серии "Алгоритмы", публикуемый в бесплатном разделе. Начиная со следующего, публикация уроков будет продолжена в платном разделе. В бесплатном же разделе, возможно, иногда будут публиковать некоторые статьи, посвященные алгоритмам. Исходники к уроку можно скачать здесь. На прошлом уроке мы запрограммировали и протестировали алгоритм сортировки методом Шелла. И результат нас несколько разочаровал. Может, мы неудачно выбрали последовательность проходов? Давайте проверим другие варианты. Но сначала мы чуть чуть изменим метод ShellSort:
Как видим, последовательность чисел мы теперь будет задавать в параметре. И попробуем задать другую последовательность чисел, вместо 9,5,3,2,1 зададим 15,9,5,3,2,1 (выделено маркером):
Теперь время сортировки составило 50 секунд (в прошлый раз было 84 сек.): Теперь попробуем поменять числа в последовательности, например, попробуем так: 15,11,5,3,2,1. Время получилось 47 секунд. Как видим, изменилось мало. Попробуем добавить впереди еще одно число: 17,15,11,5,3,2,1. Время 46 секцнд: Тоже мало что изменилось. А если первое число не 17, а например, 25? Получается 31 секунда: Сделаем еще более длинную последовательность: 50, 45, 35, 25, 15, 11, 5, 3, 2, 1. У нас получается вообще 15 секунд: Какую закономерность мы наблюдаем? Чем больше чисел в последовательности, тем более быстро идет сортировка! Если честно это уже давно примечено. Так, согласно Википедии, существует ряд стандартных последовательностей для алгоритма сортировки Шелла, например 2i-1≤N, где N - число элементов в сортируемом массиве. При этом сложность алгоритма, по утверждению Википедии, должна быть N3/2. Давайте это проверим. Для начала переделаем слегка метод SortShell:
SequenceForShell - это список чисел, он должен быть объявлен в классе Sort:
И для инициализации этого массива предусмотрим метод CreateSequenceForShell:
Теперь немного переделам обработчик нажатия на кнопочку пуск, что бы протестить изменения, которые мы внесли в алгоритм сортировки методом Шелла:
Замечу сразу, что тестировать обязательно, потому что изменив что то в программном коде, мы можем его поломать. А значит, нужно убедиться, что все в порядке, ничего "не полетело". И так, проверим работу алгоритма: И приступим к его тестированию:
И что мы видим? Действительно, работать стало не просто быстро, а очень быстро. 240 тыс. элементов примерно за 1 секунду: А если миллион? То получается около двух секунд: А вот если взять 10 миллионов элементов, то время сортировки растягивается уже на 8 секунд: При чем заметьте, мы увеличили размер массива в 10 раз, а время сортировки возросло всего лишь в 4 раза. Эффект налицо! Для прикола попробуем отсортировать сто миллионов элементов. Получилось 2 минуты с копейками: Исходники к уроку можно скачать здесь. * Г. Шилдт, "Теория и практика С++". |
||||||||
Последнее обновление ( 03.01.2013 г. ) |
Пред. » |
---|