Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Сортировка с разделением (быстрая сортировка).




Основана на принципе обмена. Эта сортировка дает лучшие из известных результатов. Алгоритм основан на том факте, что для достижения большей эффективности желательно производить обмены на большие расстояниях. Предположим, что даны т-эл-тов с ключами расположенными в обратном порядке. Их можно рассортировать выполнив всего n/2 обменов если сначала поменять самый левый и самый правый эл-ты и так постепенно приближаться с двух концовк середине. Рассм. алгоритм:

Выберем случайным образом какой-то эл-т (назовем его х). Просмотрим массив двигаясь слева на право, пока не найдем ai>x, а затем рассмотрим его справа на лево пока не найдем aj<x, поменяем местами эти эл-ты. Далее продолжим процесс просмотра с обменом пока два просмотра не встретятся в середине массива. В результате массив разделится на две части – левую с ключами меньше х, и правую с ключами больше х.

var w,x:item begin i:=q; j:=n; {выбор случайного эл-та х} repeat while a[i]<x do i:=i+1; while x<a[j] do i:=j-1; if i<=о then begin w:=a[i]; a[i]:=a[j]; a[j]:=w; i:=i+1; j:=j-1; end; until i>j end;

Если в массиве n одинаковых ключей, то понадобится n/2 обменов. Эти ненужные обмены можно удалить если изменить условие в операторах while

while a[i]<=x do i:=i+1;

while x<=a[j] do j:=j-1;

D этом случаи ч перестанет служить барьером для двух просмотров и предеться придумывать более сложное условие окончания.

Простота условий в приведенной программе оправдывает излишние обмены которые для случайных массивов происходят довольно редко.

Для того, чтобы не только разделить массив, но отсортировать надо сделать тоже самое с обеими полученными частями, затем с частями таких же частей, пока каждая часть не будет содержать только один эл-т.

procedure sort(l,r:index); var I,j:index; x,w:item; begin i:=l; j:=r; x:=a[(l+r) div 2] repeat while a[i]<x do i:=i+1; while x<a[j] do i:=j-1; if i<=о then begin w:=a[i]; a[i]:=a[j]; a[j]:=w; i:=i+1; j:=j-1; end; until i>j if l<j then sort(l,j); if i<r then sort(I,r); end begin sort(1,n); end;

В лучшем случаи число сравнений будет порядка n*log n.

Число обменов –порядка n/6*log n

Однако при небольших n ее эффективность не велика и если х выбирается наибольшее значение в массиве то в этом случаи скорость пропорциональна n2

Ссылочные типы.

Указатель – это какой-либо адрес в памяти. Это может быть адрес переменной, процедуры или ф-и. Обычно в Паскале нам не надо заботится о том где находятся в памяти. Мы только ссылаемся на эти данные при помощи его имени. Компилятор сам знает где его искать.

var Number:integer

Но можно найти этот адрес используя операнд @.

@Number

Addr(Number)

Можно присвоить этот адрес типа Pointer

var P:Pointer;

Pointer – это нетипизированный указатель, т. е. он не имеет информации о том на какой тип указывает. Чаще удобней определять указатели на определенный тип (записи объекты). Чтобы определить указатели используется знак ^ за которым следует идентификатор типа.

Например определим указатель на тип Integer

Type pinteger=^integer

Var X:Pinteger.

А можно написать сразу

Y:^Integer;

Cтавя ^ этот знак после идентификатора указателем можно получить то данное на которое этот указатель указывает. Например

NumAddress:Pinteger

……………………

Number:=7;

……………………

NumAddress:=@Number

Writeln(Number); {7}

Writeln(NumAddree^);{7}

Эта операция называется разименованием. Переменная типа Pointer не может быть разименованной. Среди всех возможных указателей в ТР выделяется один специальный, который никуда не указывает. Обозначается служебным словом nil. Указатель nil считается константой совместимой с любым ссылочным типом (переменная типа Pointer так же считается совместимой с любым ссылочным типом)

Размиенование считается некорректным если ссылочная переменная имеет значение nil.

Предположим что у нас есть следующие определения

Type указатель = ^ объект

Важно понимать разницу между ссылкой и тем объектом на который она ссылается. Пусть есть P и Q типа указатель ссылающиеся на различные объекты.

Для описания ссылочных типов сделано одно исключение из общих правил – указатель на какой-либо тип может быть описан до объявления самого типа.

Пример

Type PTRMyType = ^ MyType; MyType = record X,y:Real; End;

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных