КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Сортировка Хоара (1962 г.)
Это, по-видимому, наиболее популярный в мире метод внутренней сортировки. Установим указатели i и j на начало и конец таблицы. После сравнения ключей ti, tj изменяется один из индексов – i или j (увеличивается i или уменьшается j). Первым изменяется j. Если ti > tj, ключи меняются местами, то переключаемся на изменение противоположного указателя. Процесс продолжается до тех пор, пока указатели не "встретятся". Пример выполнения Рис. 37 Сортировка Хоара процесса изображен на рис.37. Заметим, что ключ 7 участвовал во всех сравнениях. Все ключи слева от него меньше его, все ключи справа – больше его, а сам ключ 7 занял свое окончательное положение. Рассмотренный процесс назовем разделением. Теперь можно применить тот же самый процесс к левой и правой части разделенной таблицы. int Partition(int m, int n, int t[]){ // функция выполняет разделение участка массива ключей // от m до n, возвращает точку расщепления bool b=true; // если b==true, то перемещается правый указатель // в противном случае - левый while(m<n){ if(t[m]>t[n]){ swap(t[m],t[n]); b=!b; // переключаемся на изменение другого указателя } if(b){ n--; } else { m++; } } return m; } //--------------------------------------------------- void Hoar(int m, int n, int t[]){ // функция сортирует отрезок таблицы t на участке m…n if(m>=n) return; int k=Partition(m,n,t); Hoar(m,k-1,t); Hoar(k+1,n,t); } Оценим быстродействие алгоритма в наилучшем и наихудшем случае. В лучшем случае каждый отрезок разделяется точно по середине и всего разделений log2N. В каждом отрезке проходятся все элементы, то есть для всех отрезков – N элементов. Таким образом, время оказывается пропорциональным N log2N. В худшем случае массив ключей уже упорядочен. Каждое разделение создает два отрезка, в один из них входит 1 ключ, в другой – все остальные, следовательно, число разделений равно N и время сортировки пропорционально N2. Ситуацию можно поправить выбором разделяющего ключа одним из двух способов: - выбираем ключ со случайным номером на отрезке m…n - выбираем медиану из трех ключей tm, t(m+n)/2, tn. Сортировка Хоара включена в библиотеки практически для всех компиляторов. Ниже приводится описание функции qsort, которая ее реализует. void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *)); Она имеет те же параметры, что и ранее описанная функция бинарного поиска (bsearch).
Дата добавления: 2014-12-08; Просмотров: 520; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |