русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Сортировка Хоара (1962 г.)


Дата добавления: 2015-01-16; просмотров: 752; Нарушение авторских прав


Это, по-видимому, наибо­лее популярный в мире метод внутрен­ней сортировки. Устано­вим указатели 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).



<== предыдущая лекция | следующая лекция ==>
Сортировка фон Неймана | Void BitSort(unsigned int Left, unsigned int Right,


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.151 сек.