Цифровая сортировка — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (добавлены категории)
м
Строка 1: Строка 1:
 
[[Файл:Radix.gif|thumb|right|590px|Пример цифровой сортировки]]
 
[[Файл:Radix.gif|thumb|right|590px|Пример цифровой сортировки]]
'''Цифровая сортировка'''  — алгоритм сортировки за линейное время.
+
'''Цифровая сортировка'''  — один из алгоритмов сортировки, использующих внутреннюю структуру сортируемых объектов.
==Алгоритм==
+
== Алгоритм ==
При цифровой сортировке данные разбиваются на "разряды", после этого данные сортируются какой-либо устойчивой сортировкой по каждому разряду, в порядке от младшего разряда к старшему.
+
При цифровой сортировке данные разбиваются на "разряды", после чего они сортируются какой-либо устойчивой сортировкой по каждому разряду, в порядке от младшего разряда к старшему.
Для чисел наиболее часто в качестве устойчивой сортировки применяют [[сортировка подсчетом|сортировку подсчетом]].  
+
Для чисел наиболее часто в качестве устойчивой сортировки применяют [[сортировка подсчетом|сортировку подсчетом]].
==Сложность==
+
=== Корректность алгоритма ===
Пусть <tex>k</tex> - количество разрядов, n - количество входных данных, <tex>T(n)</tex> - сложность устойчивой сортировки, тогда сложность цифровой сортировки - <tex>О(k*T(n))</tex>.
+
Докажем, что данный алгоритм работает верно, используя метод математической индукции по номеру разряда. Для простоты рассуждений будем предполагать, что объекты сортируются по неубыванию. Пусть <tex> n </tex> {{---}} количество разрядов в сортируемых объектах.
При использовании сортировки подсчетом получаем линейную зависимость.
+
*База: <tex> n = 1 </tex>. Очевидно, что алгоритм работает верно, потому что в таком случае мы просто сортируем младшие разряды какой-то заранее выбранной стабильной сортировкой.
==Псевдокод==
+
*Переход: Пусть для <tex> n = k </tex> алгоритм правильно отсортировал элементы по <tex> k </tex> младшим разрядам. Покажем, что в таком случае, при сортировке по <tex> (k + 1) </tex>-ому разряду, объекты также будут отсортированы в правильном порядке. Вспомогательная сортировка разобьет  все объекты на группы, в которых <tex> (k + 1) </tex>-ый разряд объектов одинаковый. Рассмотрим такие группы. Для сортировки по отдельным разрядам мы используем стабильную сортировку, следовательно порядок объектов с одинаковым <tex> (k + 1) </tex>-ым разрядом не изменился. Но по предположению индукции по предыдущим <tex> k </tex> разрядам объекты были отсортированы правильно, и поэтому в каждой такой группе объекты будут отсортированы верно. Также верно, что сами группы находятся в правильном относительно друг друга порядке, а следовательно и все элементы отсортированы правильно по <tex> (k + 1) </tex>-ым младшим разрядам.  
 +
== Псевдокод ==
  
 
   Radix_sort
 
   Radix_sort
 
   for i = 1 to m
 
   for i = 1 to m
 
     do устойчивая сортировка массива по i-ому разряду
 
     do устойчивая сортировка массива по i-ому разряду
 +
 +
==Сложность==
 +
Пусть <tex>k</tex> - количество разрядов, n - количество входных данных, <tex>T(n)</tex> - сложность устойчивой сортировки, тогда сложность цифровой сортировки - <tex>О(k*T(n))</tex>.
 +
При использовании сортировки подсчетом получаем линейную зависимость.
  
 
== Литература ==
 
== Литература ==

Версия 17:40, 16 мая 2012

Пример цифровой сортировки

Цифровая сортировка — один из алгоритмов сортировки, использующих внутреннюю структуру сортируемых объектов.

Алгоритм

При цифровой сортировке данные разбиваются на "разряды", после чего они сортируются какой-либо устойчивой сортировкой по каждому разряду, в порядке от младшего разряда к старшему. Для чисел наиболее часто в качестве устойчивой сортировки применяют сортировку подсчетом.

Корректность алгоритма

Докажем, что данный алгоритм работает верно, используя метод математической индукции по номеру разряда. Для простоты рассуждений будем предполагать, что объекты сортируются по неубыванию. Пусть [math] n [/math] — количество разрядов в сортируемых объектах.

  • База: [math] n = 1 [/math]. Очевидно, что алгоритм работает верно, потому что в таком случае мы просто сортируем младшие разряды какой-то заранее выбранной стабильной сортировкой.
  • Переход: Пусть для [math] n = k [/math] алгоритм правильно отсортировал элементы по [math] k [/math] младшим разрядам. Покажем, что в таком случае, при сортировке по [math] (k + 1) [/math]-ому разряду, объекты также будут отсортированы в правильном порядке. Вспомогательная сортировка разобьет все объекты на группы, в которых [math] (k + 1) [/math]-ый разряд объектов одинаковый. Рассмотрим такие группы. Для сортировки по отдельным разрядам мы используем стабильную сортировку, следовательно порядок объектов с одинаковым [math] (k + 1) [/math]-ым разрядом не изменился. Но по предположению индукции по предыдущим [math] k [/math] разрядам объекты были отсортированы правильно, и поэтому в каждой такой группе объекты будут отсортированы верно. Также верно, что сами группы находятся в правильном относительно друг друга порядке, а следовательно и все элементы отсортированы правильно по [math] (k + 1) [/math]-ым младшим разрядам.

Псевдокод

 Radix_sort
 for i = 1 to m
    do устойчивая сортировка массива по i-ому разряду

Сложность

Пусть [math]k[/math] - количество разрядов, n - количество входных данных, [math]T(n)[/math] - сложность устойчивой сортировки, тогда сложность цифровой сортировки - [math]О(k*T(n))[/math]. При использовании сортировки подсчетом получаем линейную зависимость.

Литература

  • Дональд Кнут Искусство программирования, том 3. Сортировка и поиск
  • Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ

Ссылки