<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335309</guid>
        <pubDate>Fri, 09 Apr 2004 20:20:05 +0000</pubDate>
        <title>Как упорядочить массив по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335309</link>
        <description><![CDATA[romtek: <strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>7) Сортировка массива по возрастанию (метод фон Неймана, слияний)</span></strong><br>
<br>
Алгоритм фон Неймана упорядочивания массива (алгоритм сортировки слияниями) основан на многократных слияниях уже упорядоченных групп элементов массива. Вначале весь массив рассматривается как совокупность упорядоченных групп по одному элементу в каждой. Слиянием соседних групп получаем упорядоченные группы, каждая из которых содержит два элемента (кроме, возможно, последней группы которой не нашлось парной). Далее, упорядоченные группы укрупняются тем же способом и т.д.<br>
<br>
Алгоритм дает хорошие показатели по скорости работы, даже в сравнении с сортировкой методом бинарных деревьев. Единственный недостаток - необходимость использовать дополнительный массив того же размера.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(*******************************************************</div><div class="code_line">Процедура для сортировки массива.</div><div class="code_line">Принимает:</div><div class="code_line">&nbsp;&nbsp; &nbsp;*массив значений a с индексами элементов от 0 до N-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;*число элементов N</div><div class="code_line">*******************************************************)</div><div class="code_line">procedure NeumanSort(var Arr : array of Real; N : Integer);</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; &nbsp;PTArr = ^TArr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TArr = array[0 .. pred(maxint div sizeof(real))] of real;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;C &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : &nbsp; Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;I,I1,I2,</div><div class="code_line">&nbsp;&nbsp; &nbsp;N1,N2,J,K &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp &nbsp; &nbsp; &nbsp; &nbsp; : &nbsp; Real;</div><div class="code_line">&nbsp;&nbsp; &nbsp;BArr &nbsp; &nbsp; &nbsp; &nbsp;: &nbsp; PTArr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MergeLen &nbsp; &nbsp;: &nbsp; Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(BArr, (N - 1) * sizeof(real));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MergeLen:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;c:=True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while MergeLen&#60;n do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if C then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i+MergeLen&#60;=n do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i1:=i+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i2:=i+MergeLen+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;n1:=i+MergeLen;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;n2:=i+2*MergeLen;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if n2&#62;n then n2:=n;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (i1&#60;=n1)or (i2&#60;=n2) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if i1&#62;n1 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i2&#60;=n2 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BArr^[i-1]:=Arr[i2-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i2:=i2+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if i2&#62;n2 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i1&#60;=n1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BArr^[i-1]:=Arr[i1-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i1:=i1+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[i1-1]&#62;Arr[i2-1] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BArr^[i-1]:=Arr[i2-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i2:=i2+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BArr^[i-1]:=Arr[i1-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i1:=i1+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i:=i+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i&#60;=n do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BArr^[i-1]:=Arr[i-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i+MergeLen&#60;=n do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i1:=i+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i2:=i+MergeLen+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;n1:=i+MergeLen;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;n2:=i+2*MergeLen;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if n2&#62;n then n2:=n;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (i1&#60;=n1)or (i2&#60;=n2) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if i1&#62;n1 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i2&#60;=n2 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[i-1]:=BArr^[i2-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i2:=i2+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if i2&#62;n2 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i1&#60;=n1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[i-1]:=BArr^[i1-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i1:=i1+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if BArr^[i1-1]&#62;BArr^[i2-1] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[i-1]:=BArr^[i2-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i2:=i2+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[i-1]:=BArr^[i1-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i1:=i1+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while i&#60;=n do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[i-1]:=BArr^[i-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MergeLen:=2*MergeLen;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;c:=not(C);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if not(C) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;i:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[i-1]:=BArr^[i-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;until not(i&#60;=n);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FreeMem(BArr, (N - 1) * sizeof(real));</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>8) Сортировка массива по возрастанию (метод быстрой сортировки)</span></strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure QuickSort(var A: Array of word; L, R: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;I, J: Integer;</div><div class="code_line">&nbsp;&nbsp;P, T: Word;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp;I := L;</div><div class="code_line">&nbsp;&nbsp; &nbsp;J := R;</div><div class="code_line">&nbsp;&nbsp; &nbsp;P := A[(L + R) shr 1];</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;while A[I]&#60; P do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Inc(I);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;while A[J]&#62; P do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Dec(J);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if I &#60;= J then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;T := A[I];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;A[I] := A[J];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;A[J] := T;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Inc(I);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Dec(J);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;until I &#62; J;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if L &#60; J then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;QuickSort(A, L, J);</div><div class="code_line">&nbsp;&nbsp; &nbsp;L := I;</div><div class="code_line">&nbsp;&nbsp;until I &#62;= R;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335268</guid>
        <pubDate>Fri, 09 Apr 2004 19:03:27 +0000</pubDate>
        <title>Как упорядочить массив по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335268</link>
        <description><![CDATA[romtek: <strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>5) Сортировка массива методом Шелла</span></strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(*******************************************************</div><div class="code_line">Процедура для сортировки массива.</div><div class="code_line">Принимает:</div><div class="code_line">&nbsp;&nbsp; &nbsp;*массив значений a с индексами элементов от 0 до N-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;*число элементов N</div><div class="code_line">*******************************************************)</div><div class="code_line">procedure ShellSort(var Arr : array of Real; N : Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;C &nbsp; : &nbsp; Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;E &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;G &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;I &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;J &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp : &nbsp; Real;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;N:=N-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;g:=((n+1) div 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;i:=g;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;j:=i-g;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c:=True;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[j]&#60;=Arr[j+g] then c:=False</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tmp:=Arr[j];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[j]:=Arr[j+g];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[j+g]:=Tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dec(j)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;until not((j&#62;=0)and(C));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc(i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;until not(i&#60;=n);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;g:=g div 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;until not(g&#62;0);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>6) Сортировка массива по возрастанию (метод Уильяма Флойда, бинарных деревьев)</span></strong><br>
<br>
Алгоритм основан на представлении массива в виде бинарного дерева, обладающего особыми свойствами. В памяти компьютера все элементы массива расположены последовательно, структура же дерева определяется следующим образом: будем считать, что i-ый элемент массива (&quot;предок&quot;) имеет два элемента потомка с номерами <em class='tag-i'>2i+1</em> и <em class='tag-i'>2i+2</em>. Дерево имеет нормальную форму, если любой элемент предок больше своих потомков.<br>
<br>
Из свойств алгоритма стоит заметить, что он дает стабильно хорошую скорость упорядочивания (порядка n*log(n)), вне зависимости от того с каким массивом работает, и поэтому используется в случаях когда необходимо гарантировано упорядочить массив за короткое время.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(*******************************************************</div><div class="code_line">Процедура для сортировки массива.</div><div class="code_line">Принимает:</div><div class="code_line">&nbsp;&nbsp; &nbsp;*массив значений a с индексами элементов от 0 до N-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;*число элементов N</div><div class="code_line">*******************************************************)</div><div class="code_line">procedure HeapSort(var Arr : array of Real; N : Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;I,J,K,T &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp : &nbsp; Real;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;t:=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while t&#60;&#62;1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;k:=t div 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[k-1]&#62;=Arr[t-1] then t:=1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tmp:=Arr[k-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[k-1]:=Arr[t-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[t-1]:=Tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t:=k;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inc(i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;until not(i&#60;=n);</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=n-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Tmp:=Arr[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Arr[i]:=Arr[0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Arr[0]:=Tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;t:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while t&#60;&#62;0 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;k:=2*t;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if k&#62;i then t:=0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if k&#60;i then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if Arr[k]&#62;Arr[k-1] then inc(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[t-1]&#62;=Arr[k-1] then t:=0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tmp:=Arr[k-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[k-1]:=Arr[t-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[t-1]:=Tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t:=k;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dec(i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;until not(i&#62;=1);</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335240</guid>
        <pubDate>Fri, 09 Apr 2004 18:21:47 +0000</pubDate>
        <title>Как упорядочить массив по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335240</link>
        <description><![CDATA[romtek: <strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>3) Сортировка массива по возрастанию (метод простых вставок)</span></strong><br>
<br>
Последовательно просматриваем <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>1</span> , ..., <span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>n-1</span></em> и каждый новый элемент <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>i</span></em> вставляем на подходящее место в уже упорядоченную совокупность <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>i-1</span></em> , ..., <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>1</span></em> . Это место определяется последовательным сравнением <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>i</span></em> с упорядоченными элементами <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>0</span></em> , ..., <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>i-1</span></em> .<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(*******************************************************</div><div class="code_line">Процедура для сортировки массива.</div><div class="code_line">Принимает:</div><div class="code_line">&nbsp;&nbsp; &nbsp;*массив значений a с индексами элементов от 0 до N-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;*число элементов N</div><div class="code_line">*******************************************************)</div><div class="code_line">procedure InsertionSort(var Arr : array of Real; N : Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;I &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;J &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;K &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp : &nbsp; Real;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;dec(N);</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;j:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[i]&#60;=Arr[j] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;k:=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tmp:=Arr[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[k]:=Arr[k-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dec(k);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;until not(k&#62;j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[j]:=Tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;j:=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else inc(j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;until not(j&#60;i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;until not(i&#60;=n);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray">В связи с многочисленными просьбами добавляю реализацию метода простых вставок <em class='tag-i'>без циклов с пост-условием</em>:</span><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure InsertionSort(var Arr: array of real; n: integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;i, j: integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;T: real;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 0 to n - 1 do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;T := Arr[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;j := i - 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while (j &#62;= 0) and (T &#60; Arr[j]) do begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[j + 1] := Arr[j];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dec(j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Arr[j + 1] := T;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>4) Сортировка массива по возрастанию (метод бинарных вставок)</span></strong><br>
<br>
Этот алгоритм представляет из себя оптимизированную версию предыдущего, отличие заключается в том, что при поиске место, на которое надо вставить элемент <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>i</span></em>  в уже упорядоченную совокупность <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>0</span> , ..., <span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><span class='tag-size' data-value='8' style='font-size:8pt;'>i-1</span></em> , определяется алгоритмом деления пополам (отсюда и название алгоритма &quot;бинарные вставки&quot; здесь понимаем как &quot;вставка делением пополам&quot;).<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(*******************************************************</div><div class="code_line">Процедура для сортировки массива.</div><div class="code_line">Принимает:</div><div class="code_line">&nbsp;&nbsp; &nbsp;*массив значений a с индексами элементов от 0 до N-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;*число элементов N</div><div class="code_line">*******************************************************)</div><div class="code_line">procedure BinaryInsertionSort(var Arr : array of Real; N : Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;B,C,E,I,J,K &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp : &nbsp; Real;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;i:=2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;b:=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;e:=i-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;c:=((b+e) div 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while b&#60;&#62;c do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[c-1]&#62;Arr[i-1] then e:=c</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else b:=c;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c:=((b+e) div 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if Arr[b-1]&#60;Arr[i-1] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[i-1]&#62;Arr[e-1]</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; then b:=e+1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else b:=e;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Tmp:=Arr[i-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while k&#62;b do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[k-1]:=Arr[k-1-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dec(k)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Arr[b-1]:=Tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp;until not(i&#60;=n);</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335224</guid>
        <pubDate>Fri, 09 Apr 2004 17:40:10 +0000</pubDate>
        <title>Как упорядочить массив по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=50914&amp;view=findpost&amp;p=335224</link>
        <description><![CDATA[romtek: <div class='tag-align-center'><strong class='tag-b'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><span class='tag-size' data-value='14' style='font-size:14pt;'>- Алгоритмы сортировки -</span></span></strong></div><br>
<br>
<strong class='tag-b'>Рассмотрим следующие виды сортировки массива по возрастанию:</strong><ol class="tag-list" type="1"><li>метод выбора (SelectionSort)</li><li>метод пузырька (BubbleSort)</li><li>метод простых вставок (InsertionSort)</li><li>метод бинарных вставок (BinaryInsertionSort)</li><li>метод Шелла (ShellSort)</li><li>метод Уильяма Флойда, бинарных деревьев (HeapSort)</li><li>метод фон Неймана, слияний (NeumanSort)</li><li>метод быстрой сортировки (QuickSort)</li></ol><sub class='tag-sub'>x</sub><br>
<hr><strong class='tag-b'>Примечание:</strong> В рассмотренных методах сортировки берутся массивы, начинающиеся с индекса <span class="tag-color tag-color-named" data-value="blue" style="color: blue">0</span> &#33;<br>
Для начинающихся с <span class="tag-color tag-color-named" data-value="blue" style="color: blue">1</span>, нужно изменять коэффициенты в самой процедуре.<hr><br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>1) Сортировка массива по возрастанию методом выбора</span></strong><br>
<br>
Это наиболее естественный алгоритм упорядочивания. Допустим, что элементы <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>0</sub> , ..., <span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>i-1</sub></em>  уже упорядочены, тогда среди оставшихся <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>i</sub></em> , ..., <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>n-1</sub></em>  находим минимальный элемент и меняем его местами с <em class='tag-i'>i</em>-тым элементом. И так далее, пока массив не будет полностью упорядочен.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(*******************************************************</div><div class="code_line">Процедура для сортировки массива.</div><div class="code_line">Принимает:</div><div class="code_line">&nbsp;&nbsp; &nbsp;*массив значений a с индексами элементов от 0 до N-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;*число элементов N</div><div class="code_line">*******************************************************)</div><div class="code_line">procedure SelectionSort(var arr : array of Real; const N : Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;I &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;J &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;K &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;M &nbsp; : &nbsp; Real;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=1 to N do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m:=Arr[i-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;k:=i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for j:=i to n do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if m&#62;Arr[j-1] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m:=Arr[j-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;k:=j;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Arr[k-1]:=Arr[i-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Arr[i-1]:=m;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='12' style='font-size:12pt;'>2) Сортировка массива по возрастанию (метод пузырька)</span></strong><br>
<br>
Последовательно просматриваем числа <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>0</sub></em> , ..., <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>n-1</sub></em>  находим наименьшее <em class='tag-i'>i</em> такое, что <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>i</sub>  &gt; <span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>i+1</sub></em> . Поменять <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>i</sub></em>  и <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>i+1</sub></em>  местами, возобновить просмотр с элемента <em class='tag-i'><span class='tag-size' data-value='10' style='font-size:10pt;'>a</span><sub class='tag-sub'>i+1</sub></em>  и т.д. Тем самым наибольшее число передвинется на последнее место. Следующие просмотры начинать опять сначала, уменьшая на единицу количество просматриваемых элементов. Массив будет упорядочен после просмотра, в котором участвовали только первый и второй элементы.<br>
<br>
<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(*******************************************************</div><div class="code_line">Процедура для сортировки массива.</div><div class="code_line">Принимает:</div><div class="code_line">&nbsp;&nbsp; &nbsp;*массив значений a с индексами элементов от 0 до N-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;*число элементов N</div><div class="code_line">*******************************************************)</div><div class="code_line">procedure BubbleSort(var Arr : array of Real; const N : Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;I &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;J &nbsp; : &nbsp; Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp : &nbsp; Real;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i:=Pred(N) downto 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for j:=0 to Pred(i) do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Arr[j]&#62;=Arr[j+1] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tmp:=Arr[j];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[j]:=Arr[j+1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arr[j+1]:=Tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      </channel>
      </rss>
	