Реферат: Сравнение эффективности методов сортировки массивов: Метод прямого выбора и метод сортировки с помощью дерева

Лабораторная работа № 1

Сравнить эффективность методов сортировки массивов:

Метод прямого выбора и метод сортировки с помощью дерева.

Сортировка с помощьюпрямого выбора

Этот прием основан на следующихпринципах:

1.Выбирается элемент с наименьшим ключом.

2.Он меняется местами с первым элементомai.

3.Затем этот процесс повторяется с оставшимися n-1элементами, n-2элементами и т.д. до тех пор,пока не останется один, самый большой элемент.

Процесс работы этим методом с темиже восемью ключами, что и в табл.2.1,приведен в табл.2.2. Алгоритмформулируется так:

FORi:=ITOn-1 DO

присвоитьkиндекснаименьшего изa[i],,,a[nJ; поменять местамиa[i] и a[j];

end

Такой метод– егоназывают прямымвыбором–в не­котором смысле противоположен прямомувключению. При прямом включении на каждом шаге рассматри­ваются только один очередной элемент исходнойпоследовательности и все элементыготовой последо­вательности, среди которых отыскивается точка вклю­чения; припрямом выборе для поиска одного эле­ментас наименьшим ключом просматриваются все элементы исходной последовательности инайденный помещается как очередной элемент в готовую после­довательность.Полностью алгоритм прямого выбора приводится в прогр.2.3.

Таблица2.2. Пример сортировки с помощью прямого выбора

Начальные ключи

<span Courier New";mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">44 55 12 42 94 18 06 67

<span Courier New";mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">06 55 12 42 94 18 44 67

<span Courier New";mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">06 12 55 42 94 18 44 67

<span Courier New";mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">06 12 18 42 94 55 4467

<span Courier New";mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">05 12 18 42 94 55 44 67

<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">05

<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">12 13 42 44 55 94 67

<span Courier New";mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">06 12 18 42 44 55 9467

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode: line">06

<span Courier New";mso-bidi-font-family:«Times New Roman»;layout-grid-mode: line;mso-no-proof:yes"> 12 18 42 44 55 67 94

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line">PROCEDURE StraightSfcleclion;

VARi,j,k: index; x:item; BEGIN

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line">FORi:=1TO n-1 DO k:= i; x

<span Courier New";mso-bidi-font-family:«Times New Roman»; layout-grid-mode:line;mso-no-proof:yes"> :=<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: EN-US;layout-grid-mode:line"> a[i]; FORj:=i+1TO n DO <span Courier New";mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line; mso-no-proof:yes">        

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line">IF a[j]<xTHENk:=j;X:= a[k] END BND;

<span Courier New";mso-bidi-font-family:«Times New Roman»; layout-grid-mode:line">а<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line">[k]:=а[i];<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language: EN-US;layout-grid-mode:line"> a[i]<span Courier New";mso-bidi-font-family:«Times New Roman»; layout-grid-mode:line;mso-no-proof:yes"> ; =<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line"> x END ENDStraightSelection

Прогр.2.3.Сортировка с помощью прямого выбора,

Анализ прямого выбора.Число сравнений ключей (С), очевидно, не зависитот начального порядка клю­чей. Можно сказать, что в этом смысле поведение этогометода менее естественно, чем поведение пря­мого включения. Для С имеем

<span Arial",«sans-serif»;mso-bidi-font-family:«Times New Roman»;layout-grid-mode: line">с=(n

<span Arial",«sans-serif»; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode: line">2<span Arial",«sans-serif»; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">-<span Arial",«sans-serif»;mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line"> n)/2

Число перестановокминимально Mmin=3*(n-l)   (2.6)

в случае изначально упорядоченных ключей и макси­мально

<span Arial",«sans-serif»; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line">Mmax

<span Arial",«sans-serif»; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line"> =n2/4 +3(n-1)

если первоначально ключи располагались в обратном порядке. Для того чтобыопределитьMavg,мы должны рассуждать так. Алгоритм просматриваетмассив, сравнивая каждый элемент с только что обнаружен­ной минимальнойвеличиной; если он меньше первого, то выполняется некоторое присваивание.Вероят­ность, что второй элемент окажется меньше первого, равна1/2, с этой же вероятностью происходят при­сваивания минимуму. Вероятность, что третий эле­ментокажется меньше первых двух, равна1/3, аве­роятность для четвертого оказаться наименьшим— 1/4 и т. д.Поэтому полное ожидаемое число пересы­лок равно Нn—1, где Нn — n-егармоническое число:

Нn=1+1/2+1/3+...+1/nНпможно выразить и так: Нп=Inn+g+1/2n— 1/12n2 + ...

гдеg=0.577216… —константа Эйлера. Длядоста­точно больших n мы можем игнорировать дробныесоставляющие и поэтому аппроксимировать среднее число присваиванийнаi-мпросмотре выражением

Fi-lni+g+l

Среднее число пересылокMavg всортировке с вы­бором есть суммаFiсiот1 до n:

Mavg=n*(g+l)+(Si: 1<i<n; lni)

Вновь аппроксимируя этусумму дискретных членов интегралом Integral(1:п)ln x dx==x*(ln x—1) ==n*ln(п)—n+I

получаем, наконец,приблизительное значение Mavg=n(ln (n)+g)

Отсюда можно сделать заключение, что, как правило, алгоритм с прямымвыбором предпочтительнее стро­гого включения. Однако, если ключи в начале упоря­доченыили почти упорядочены, прямое включение будет оставаться несколько более быстрым.

 2.3.2.Сортировка с помощью дерева

Метод сортировки с помощью прямого выбора ос­нованна повторяющихся поисках наименьшего ключа среди nэлементов, среди оставшихся n—1 элемен­тов и т. д. Обнаружениенаименьшего среди п эле­ментов требует—это очевидно —n — 1 сравнения, среди n — 1 уже нужно n — 2 сравнений и т.д. Сумма первых n — 1целых равна 1/2*(n2 — n). Как же в та­ком случае можно усовершенствоватьупомянутый ме­тод сортировки? Этого можно добиться, только остав­ляя послекаждого прохода больше информации, чем просто идентификация единственногоминимального элемента. Например, сделав n/2 сравнений, можно определить в каждой паре ключейменьший. С по­мощью n/4сравнений — меньший из пары уже вы­бранныхменьших и т. д. Проделав n— 1 сравнений, мы можем построить дерево выбора вроде представ­ленногона рис.2,3 и идентифицировать его коренькак нужный нам наименьший ключ[2.21.

Второй этап сортировки — спусквдоль пути, отме­ченного наименьшим элементом, и исключение его из дерева путемзамены либо на пустой элемент (дырку) в самом низу,либо на элемент из соседней ветви в промежуточных вершинах (см. рис.2.4 и2.5). Элемент,передвинувшийся в корень дерева, вновь бу­дет наименьшим (теперь уже вторым)ключом, и его можно исключить. После п таких шаговдерево станет пустым (т. е. в нем останутся только дырки), и процесс сортировкизаканчивается. Обратите внима­ние — на каждомиз nшагов выбора требуетсятолько lognсравнений. Поэтому на весь процесс понадобит­ся порядкаn*lognэлементарных операций плюс еще n шагов на построение дерева. Это весьма суще­ственноеулучшение не только прямого метода, тре­бующего п2 шагов, но и даже метода Шелла,где нужно п^1.2  шага. Естественно,сохранение дополни­тельной информации делает задачу более изощренной, поэтому всортировке по дереву каждый отдельный шаг усложняется. Ведь в конце концов длясохране­ния  избыточной  информации,  получаемой при начальном проходе, создается некоторая древообраз­ная структура.Наша следующая задача— найти приемыэффективной организации этой информации.

Конечно, хотелось бы, в частности, избавиться от дырок, которыми вконечном итоге будет заполнено все дерево и которые порождают много ненужныхсравнений. Кроме того, надо было бы поискать такоепредставление дерева из пэлементов, которое требует лишь пединиц памяти, а не 2n—1, как это былораньше. Этих целей действительно удалось добиться вметодеHeapsort<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:EN-US;mso-fareast-language: RU;mso-bidi-language:AR-SA;layout-grid-mode:line">[1]*)

изобретенномД. Уилльямсом(2.14),где было получено, очевидно, существенное улучшение традиционных сортировок спомощью де­ревьев. Пирамида определяется как последователь­ность ключейhi., hL+1,..,hr,такая, что

<img src="/cache/referats/1358/image002.gif" v:shapes="_x0000_i1025">

Если любое двоичное дерево рассматривать как мас­сив по схеме на рис.2.6, то можно говорить, что де­ревьясортировок на рис.2.7 и2.8 суть пирамиды, а элементh1,в частности, их наименьший элемент: hi==min(hi,h2,...,hn).Предположим, есть некото­рая пирамида сзаданными элементамиhL+1,...,hRдля некоторых значенийL иRи нужнодобавить но­вый элемент х, образуя расширенную пирамидуhi.,.. . ...,liR.Возьмем, например, в качестве исходной пи­рамидуhi,...,hr,показанную на рис.2.7, и добавим к ней слева элементh1==44<span Times New Roman",«serif»;mso-fareast-font-family:«Times New Roman»;mso-ansi-language: EN-US;mso-fareast-language:RU;mso-bidi-language:AR-SA;layout-grid-mode:line">[2]

Новая пирамида по­лучается так: сначала х ставится наверх древовидной структуры, а затем онпостепенно опускается вниз каждый раз по направлению наименьшего из двухпримыкающих к нему элементов, а сам этот элемент передвигается вверх. Вприведенном примере значе­ние44 сначаламеняется местами с06, затем с12 ц в результатеобразуется дерево, представленное на рис.2.8.Теперь мы сформулируем этот сдвигающий алгоритм так:i,j—пара индексов, фиксирующих эле­менты, меняющиеся на каждом шаге местами.Чита­телю остается лишь убедиться самому, что предложен­ный метод сдвиговдействительно сохраняет неизмен­ным условия(2.13), определяющие пирамиду.

Р.Флойдомбыл предложен некий «лаконичный»способ построения пирамиды «на том же месте». Его процедура сдвига представленакак прогр.2.7. Здесь hi. ..hn —некий массив, причем Ьщ...hn (пп= ==(nDIV2)+1)уже образуют пирамиду, поскольку индексовi, j,удовлетворяющих отношениямj =2i (илиj = 2i+1), просто несуществует. Эти элементы образуют как бы нижний слой соответствующего двоичногодерева (см. рис.2.6), для них никакой

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line">P

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line">ROCEDUREsift(L, R; index);

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode:line">VAR i, j:index; x: item;

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line">B

<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line">EGINi<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">:<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line"> = L; J<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">:<span Courier New";mso-bidi-font-family:«Times New Roman»; layout-grid-mode:line;mso-no-proof:yes">=<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line"> 2*L;<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">x :=<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US; layout-grid-mode:line"> a[L];

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode:line">IF (j

<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes"><<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line"> R)<span Courier New"; mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">&<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode:line"> (a[J+l]<span Courier New";mso-bidi-font-family:«Times New Roman»;layout-grid-mode:line; mso-no-proof:yes"> <<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US; layout-grid-mode:line"> a[j] THEN j<span Courier New";mso-bidi-font-family:«Times New Roman»; layout-grid-mode:line;mso-no-proof:yes">:=<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode: line">j+l<span Courier New";mso-bidi-font-family:«Times New Roman»; mso-ansi-language:EN-US;layout-grid-mode:line"> END<span Courier New";mso-bidi-font-family: «Times New Roman»;layout-grid-mode:line;mso-no-proof:yes">;

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode:line">WHILE

<span Courier New";mso-bidi-font-family:«Times New Roman»; layout-grid-mode:line;mso-no-proof:yes"> (j <<span Courier New";mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US; layout-grid-mode:line"> =R)&(a[j]<x) DO

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode:line">a[i]:= a[j]: i:=j; i:= 2*j;

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode: line">IF

<span Courier New"; mso-bidi-font-family:«Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode: line">(j<R)&(a[j+1]<a[j]) THEN j:=j+1 END

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode:line">END

<span Courier New";mso-bidi-font-family: «Times New Roman»;mso-ansi-language:EN-US;layout-grid-mode:line">END sift

Прогр.2.7.Sift.

упорядоченности не требуется. Теперь пирамида рас­ширяется влево; каждыйраз добавляется и сдвигами ставится в надлежащую позицию новый элемент. Табл.2.6 иллюстрирует весь этот процесс, а получаю­щаясяпирамида показана на рис.2.6.

Следовательно, процесс формирования пирамиды из пэлементовhi...hnна том же самом месте опи­сывается так:

L :==(n DIV2) + 1;

WHILE L>1 DO L:==L —1;sift(L, n) END

Для того чтобы получить не только частичную, но и полную упорядоченностьсреди элементов, нужно про­делатьnсдвигающих шагов, причем после каждого шага на вершину дерева выталкиваетсяочередной (наименьший) элемент. И вновь возникает вопрос: где хранить«всплывающие» верхние элементы и мож­но ли или нельзя проводить обращение натом же месте? Существует, конечно, такой выход:каждый раз брать последнюю компоненту пирамиды (скажем, это будет х), прятать верхний элемент пирамидыв освободившемся теперь месте, а х сдвигать в нужноеместо. В табл.2.7 приведены необходимыев этом слу-

.Таблица2.6, Построение пирамиды

44

55

12

42

94

18

06

67

44

55

12

42

94

18

06

67

44

55

06

42

94

18

12

67

44

42

06

55

94

18

12

67

06

42

12

55

94

18

44

67

Таблица2.7.Пример процесса сортировки с помощьюHeapsort

06

42

12

55

94

18

44

67

12

42

18

55

94

67

44

06

18

42

44

55

94

67

12

06

42

55

44

67

94

18

12

06

44

55

94

67

42

18

12

06

55

67

94

44

42

18

12

06

67

94

55

44

42

18

12

06

94

67

55

44

42

18

12

06

чаеn — 1 шагов. Сам процессописывается с помощью процедурыsift(прогр.2.7) такимобразом:

R:=n;WHILE R>1 DO х:=а[l];a[l]:=a[R]; a[R]:=x: R:=R-l; sift(l,R)END

Пример из табл.2.7 показывает, чтополучающийся порядок фактически является обратным. Однако это можно легкоисправить, изменив направление «упо­рядочивающегоотношения» в процедуреsift.В конце концов получаем процедуруHeapsort(прогр.2.8),

PROCEDURE HeapSort; VAR L, R: index;х:item; PROCHDURE sift(L, R: index); VAR i,j:index;x:item; BEGIN i:=L; j:=2*L: x:=a[L]; IF(j<R)&(a[j]<a[j+1])THEN j:=j+lEND; WHILE(j<=R)&(x<a[j])DO a[i]:=a[j]; i :=j: j:=2*j: IF(J<R)&(a[i]<a[j+l]) THENj:=j+1 END END ENDsift;

BEGIN L:=:(nDIV2)+l:R:=n; WHILE L>1 DO L:=L-l;sift(L,R) END; WHILER>1DO x :=a[l]; a[l]:=a[R]; a[R]:=x; R:=R-l; sifl(L, R) END ENDHeapSort

Прогр.2.8.HeapsorL

АнализHeapsort.На первый взглядвовсе не оче­видно, что такой метод сортировки дает хорошие ре­зультаты. Ведь вконце концов большие элементы, прежде чем попадут на свое место в правой части,сначала сдвигаются влево. И действительно, про­цедуру не рекомендуетсяприменять для небольшого, вроде нашего примера, числа элементов. Для боль­шихжеn Heapsortочень эффективна; чем больше п, тем лучше она работает. Она дажестановится срав­нимой с сортировкой Шелла.

В худшем случае нужно п/2 сдвигающих шагов, они сдвигают элементы наlog(n/2),log(п/2—1),… ...,log(n—l)позиций (логарифм (по основанию2)] «обрубается» до следующего меньшегоцелого). Сле­довательно, фаза сортировки требуетn—1 сдвигов с самое большоеlog(n—1),log(n—2), ..., 1переме­щениями. Крометого, нужно ещеn —1 перемещений дляпросачивания сдвинутого элемента на некоторое расстояние вправо. Этисоображения показывают, что даже в самом плохом из возможных случаевHeap-sortпотребуетn*log nшагов. Великолепная произ­водительность в таких плохих случаях—одно из при­влекательных свойствHeapsort.

Совсем не ясно, когда следует ожидать наихудшей (или наилучшей)производительности. Но вообще-то кажется, чтоHeapsort«любит» начальные последо­вательности, в которыхэлементы более или менее отсортированы в обратном порядке. Поэтому ее по­ведениенесколько неестественно. Если мы имеем дело с обратным порядком, то фазапорождения пирамиды не требует каких-либо перемещений. Среднее числоперемещений приблизительно равно п/2*log(n), при­чем отклонения от этого значенияотносительно неве­лики.


<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">[1]

Здесьмы оставляем попытки перевести названия соответ­ствующих методов на русскийязык, ибо ни уже не более чем собственные имена, хотя в названиях первыхупоминавшихся методов еще фигурировал некоторый элемент описания сути са­могоприема сортировки.— Прим. перев.

<span Times New Roman",«serif»; mso-fareast-font-family:«Times New Roman»;mso-ansi-language:RU;mso-fareast-language: RU;mso-bidi-language:AR-SA">[2]

Этонесколько противоречит утверждению, чтоlu+i..) ...hr—пирамида, но надеемся, сам читатель разберется, Что хотел сказать автор.— Прим.перев.
еще рефераты
Еще работы по программированию, базе данных