<?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=59376&amp;view=findpost&amp;p=2228378</guid>
        <pubDate>Thu, 26 Mar 2009 06:48:45 +0000</pubDate>
        <title>Как упорядочить данные по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=59376&amp;view=findpost&amp;p=2228378</link>
        <description><![CDATA[volvo877: Иногда встречается задача - организовать сортировку массива записей по любому полю, выбирать которое пользователь будет в RunTime. Ниже представлен пример реализации (опять же, с помощью процедурных типов):<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">program SortRec;</div><div class="code_line">uses crt;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;n = 4;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;{ Массив вот таких записей и надо будет отсортировать }</div><div class="code_line">&nbsp;&nbsp;TInfo=record</div><div class="code_line">&nbsp;&nbsp; &nbsp;npp &nbsp; : 1 .. n;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Fio &nbsp; : string[13];</div><div class="code_line">&nbsp;&nbsp; &nbsp;Addr &nbsp;: string[15];</div><div class="code_line">&nbsp;&nbsp; &nbsp;Month : string[8];</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tel &nbsp; : string[7];</div><div class="code_line">&nbsp;&nbsp; &nbsp;Grades: array[1 .. 5] of 2 .. 5;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Aver &nbsp;: real;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;List = array[1 .. n] of TInfo;</div><div class="code_line">&nbsp;&nbsp;TFunc = Function(T1, T2: TInfo): Integer;</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Вспомогательные функции сравнения чисел и строк.</div><div class="code_line">&nbsp;&nbsp;Можно было бы обойтись и без них, но тогда в функциях</div><div class="code_line">&nbsp;&nbsp;сравнения полей записи осуществлялись бы одинаковые</div><div class="code_line">&nbsp;&nbsp;действия</div><div class="code_line">}</div><div class="code_line">function compareVals(A, B: real): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if A &#62; B then compareVals := 1</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if A &#60; B then compareVals := -1</div><div class="code_line">&nbsp;&nbsp; &nbsp;else compareVals := 0;</div><div class="code_line">end;</div><div class="code_line">function compareStrs(sA, sB: string): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if sA &#62; sB then compareStrs := 1</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;if sA = sB then compareStrs := 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;else compareStrs := -1</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{ *** Функции сравнения полей двух записей *** }</div><div class="code_line">function cfNpp (T1,T2: TInfo): integer; far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cfNpp := compareVals(T1.npp, T2.npp);</div><div class="code_line">end;</div><div class="code_line">function cfFio (T1,T2: TInfo): integer; far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cfFio := compareStrs(T1.Fio, T2.Fio)</div><div class="code_line">end;</div><div class="code_line">function cfAddr (T1,T2: TInfo): integer; far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cfAddr := compareStrs(T1.Addr, T2.Addr);</div><div class="code_line">end;</div><div class="code_line">function cfMonth (T1,T2: TInfo): integer; far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cfMonth := compareStrs(T1.Month, T2.Month);</div><div class="code_line">end;</div><div class="code_line">function cfTel (T1,T2: TInfo): integer; far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cfTel := compareStrs(T1.Tel, T2.Tel);</div><div class="code_line">end;</div><div class="code_line">function cfAver (T1,T2: TInfo): integer; far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cfAver := compareVals(T1.Aver, T2.Aver);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Вводим тип - перечисление всех полей,</div><div class="code_line">&nbsp;&nbsp;по которым может происходить сортировка ...</div><div class="code_line">}</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TSortBy = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;_byNpp, _byFio, _byAddr, _byMonth, _byTel, _byAver</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;... и описываем названия этих полей</div><div class="code_line">&nbsp;&nbsp;(для удобства пользователя)</div><div class="code_line">}</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;Titles : array[TSortBy] of string =</div><div class="code_line">&nbsp;&nbsp; &nbsp;(&#39;by Npp&#39;, &#39;by Fio&#39;, &#39;by Addr&#39;, &#39;by Month&#39;, &#39;by Tel&#39;, &#39;by Aver&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;А также - ставим в соответствие каждому полю</div><div class="code_line">&nbsp;&nbsp;&quot;свою&quot; функцию сравнения</div><div class="code_line">}</div><div class="code_line">&nbsp;&nbsp;CompareFuncs: Array[TSortBy] Of TFunc =</div><div class="code_line">&nbsp;&nbsp; &nbsp;(cfNpp, cfFio, cfAddr, cfMonth, cfTel, cfAver);</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Собственно, процедура сортировки.</div><div class="code_line">&nbsp;&nbsp;В нее достаточно передать нужный элемент из</div><div class="code_line">&nbsp;&nbsp;перечисления полей, и массив записей будет</div><div class="code_line">&nbsp;&nbsp;отсортирован по соответствующему полю</div><div class="code_line">}</div><div class="code_line">procedure QuickSort(marker: TSortBy;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var A: List; Lo, Hi: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;i,j: integer;</div><div class="code_line">&nbsp;x, y: TInfo;</div><div class="code_line">procedure Sort (l, r: Integer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x := A[(l+r) shr 1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i := l; j := r;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while CompareFuncs[marker]( A[i], x ) &#60; 0 do inc(i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while CompareFuncs[marker]( A[j], x ) &#62; 0 do dec(j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if i &#60;= j then</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; y := A[i]; A[i] := A[j]; A[j] := y;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inc(i); dec(j);</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;until i &#62; j;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if l &#60; j then Sort (l, j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;l := i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;until l &#62;= r;</div><div class="code_line">end;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Sort (Lo,Hi);</div><div class="code_line">end; { QuickSort }</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Для простоты зададим несколько записей в виде константы</div><div class="code_line">&nbsp;&nbsp;(но в принципе массив может заполняться и в процессе</div><div class="code_line">&nbsp;&nbsp;выполнения программы)</div><div class="code_line">}</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;Data: List = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;(npp: 1; Fio: &nbsp;&#39;petrov&#39;; Addr: &#39;moscow&#39;; Month: &#39;january&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Tel:&#39;4587&#39;; Grades:(2, 2, 2, 2, 2); Aver:2.0),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(npp: 2; Fio: &#39;sidorov&#39;; Addr: &nbsp; &#39;kiev&#39;; Month: &#39;october&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Tel:&#39;2487&#39;; Grades:(5, 5, 5, 5, 5); Aver:5.0),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(npp: 3; Fio: &nbsp;&#39;ivanov&#39;; Addr: &nbsp;&#39;piter&#39;; Month: &nbsp; &#39;march&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Tel:&#39;5287&#39;; Grades:(3, 3, 3, 3, 3); Aver:3.0),</div><div class="code_line">&nbsp;&nbsp; &nbsp;(npp: 4; Fio: &nbsp;&#39;kuzmin&#39;; Addr: &#39;e-burg&#39;; Month:&#39;december&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Tel:&#39;3411&#39;; Grades:(4, 4, 4, 4, 4); Aver:4.0)</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;</div><div class="code_line">procedure PrintData;</div><div class="code_line">var i: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for i := 1 To n do</div><div class="code_line">&nbsp;&nbsp; &nbsp;with Data[i] do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn(npp:2, &#39; &#39;, Fio:10, &#39; &#39;, Addr:6, &#39; &#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Month:8, &#39; &#39;, Tel:6, &#39; &#39;, Aver:5:2);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;ix: TSortBy;</div><div class="code_line">&nbsp;&nbsp;Choice: Char;</div><div class="code_line">&nbsp;&nbsp;_sort: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;WriteLn(&#39;before:&#39;);</div><div class="code_line">&nbsp;&nbsp;PrintData;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;А теперь - самое главное: выводим все возможные</div><div class="code_line">&nbsp;&nbsp; &nbsp;варианты сортировки, и запрашиваем у пользователя</div><div class="code_line">&nbsp;&nbsp; &nbsp;(во время выполнения программы), по какому из</div><div class="code_line">&nbsp;&nbsp; &nbsp;вариантов сортировать (в данном случае число</div><div class="code_line">&nbsp;&nbsp; &nbsp;вариантов ограничено 9, но ничего не мешает</div><div class="code_line">&nbsp;&nbsp; &nbsp;обойти это ограничение чуть-чуть по другому</div><div class="code_line">&nbsp;&nbsp; &nbsp;организовав получение ответа от пользователя)</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;Writeln(&#39;sort data by:&#39;);</div><div class="code_line">&nbsp;&nbsp;For ix := Low(TSortBy) To High(TSortBy) Do</div><div class="code_line">&nbsp;&nbsp; &nbsp;writeln(1 + Ord(ix):2, &#39; - &#39;, Titles[ix]);</div><div class="code_line">&nbsp;&nbsp;Choice := ReadKey;</div><div class="code_line">&nbsp;&nbsp;_sort := Ord(Choice) - Ord(&#39;1&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Проверяем корректность полученного ответа,</div><div class="code_line">&nbsp;&nbsp; &nbsp;и если все в порядке - сортируем массив,</div><div class="code_line">&nbsp;&nbsp; &nbsp;иначе выдаем сообщение об ошибке }</div><div class="code_line">&nbsp;&nbsp;if (_sort &#62;= 0) and (_sort &#60;= Ord(High(TSortBy))) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;QuickSort (TSortBy(_sort), Data, 1, n);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteLn(&#39;after:&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;PrintData;</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Writeln(&#39;incorrect input&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ReadLn;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>volvo877</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=59376&amp;view=findpost&amp;p=643352</guid>
        <pubDate>Sun, 13 Mar 2005 19:15:07 +0000</pubDate>
        <title>Как упорядочить данные по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=59376&amp;view=findpost&amp;p=643352</link>
        <description><![CDATA[Romtek: <span class='tag-size' data-value='11' style='font-size:11pt;'><strong class='tag-b'>Эта программа сортирует массив строк или чисел</strong> с использованием процедурных типов.</span><br>
Требует знаний по указателям.<br>
<ol class="tag-list" type="1"><li>Ввод данных массива</li><li>Сортировка массива:<br>
 для массива чисел нужно выбрать функцию сравнения чисел CompareNumbers<br>
 для массива строк - функцию сравнения строк CompareStrings.<br>
Процедурный тип для вызова функции сравнения даёт возможность выбрать пользователю вид сортировки. Результатом этой функции должно быть:<br>
1, если A &gt; B<br>
0, если A = B<br>
-1, если A &lt; B<br>
<span class="tag-color tag-color-named" data-value="green" style="color: green">Можно также менять порядок сортировки по возрастанию или убыванию.</span> Для этого надо поменять знаки на противоположные в функции сравнения.<br>
<br>
<span class="tag-color tag-color-named" data-value="purple" style="color: purple">Этот способ сортировки имеет преимущество перед описанными ранее тем, что сортирует только указатели на записи, в то время как содержимое записей остаётся на своём месте, нукуда не перемещаясь. Т.е. экономится лишнее время на перемещения данных в памяти.</span><br>
</li><li>Вывод данных массива</li></ol><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">Program SortArray;</div><div class="code_line">Uses Objects;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp; N = 4; { кол-во элементов в массиве }</div><div class="code_line">&nbsp;&nbsp; SORT_STR: boolean = true;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; PInteger = ^Integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; List = array[1..N] of Pointer; { список указателей на ячейки данных }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; { процедурный тип для вызова функции сравнения }</div><div class="code_line">&nbsp;&nbsp; TSortFunc = function (a,b: pointer): integer;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Data: List;</div><div class="code_line">&nbsp;</div><div class="code_line">{$I sortfunc.inc} { подключаем дополнительный код - функция StrCmp }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">{ Здесь указываем как будем сортировать данные.</div><div class="code_line">&nbsp;&nbsp;Данные для сравнения переда„м в качестве указателей, будь то строки,</div><div class="code_line">&nbsp;&nbsp;числа, или даже структуры данных типа Запись }</div><div class="code_line">&nbsp;</div><div class="code_line">function CompareNumbers (a,b: pointer): integer; FAR; { дальний тип связи }</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if PInteger (a)^ &#62; PInteger (b)^ then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CompareNumbers := 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if PInteger (a)^ = PInteger (b)^ then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CompareNumbers := 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CompareNumbers := -1</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function CompareStrings (a,b: pointer): integer; FAR;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; CompareStrings := strcmp (PString (a)^, PString (b)^)</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure QuickSort (var A: List; SortFunc: TSortFunc; Lo, Hi: Integer);</div><div class="code_line">{ &quot;Быстрая сортировка&quot;. Можно применить любой другой вид сортировки }</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i,j: integer;</div><div class="code_line">&nbsp;&nbsp;x, y: pointer;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Sort (l, r: Integer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x := A[(l+r) div 2];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i := l; j := r;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while SortFunc (A[i], x) &#60; 0 do inc (i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while SortFunc (A[j], x) &#62; 0 do dec (j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if i &#60;= j then</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; &nbsp;y := A[i]; A[i] := A[j]; A[j] := y; { поменять указатели местами }</div><div class="code_line">&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;dec (j);</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; until i &#62; j;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if l &#60; j then Sort (l, j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; l := i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; until l &#62;= r;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Sort (Lo,Hi);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Input_Array;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">&nbsp;&nbsp;S: string;</div><div class="code_line">&nbsp;&nbsp;Num: PInteger;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Randomize; { Инициализация генератора случайных чисел }</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (#13#10&#39;*** Data input ***&#39;#13#10);</div><div class="code_line">&nbsp;&nbsp; &nbsp; if SORT_STR then</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; &nbsp;write (&#39;Enter string: &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;readln (s);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Data[i] := pointer (NewStr (s)); { резервируем память для строки }</div><div class="code_line">&nbsp;&nbsp; &nbsp; end</div><div class="code_line">&nbsp;&nbsp; &nbsp; else</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; &nbsp;New (Num); { резервируем память для числа }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Num^ := random (100); { случайные числа }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Data[i] := Num;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure View_Array;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (#13#10&#39;*** Data output ***&#39;#13#10);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if SORT_STR then</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; &nbsp;writeln (PString (Data[i])^); { вывод строки }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DisposeStr (PString (Data[i]));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { освобождаем память, взятую для числа }</div><div class="code_line">&nbsp;&nbsp; &nbsp; end</div><div class="code_line">&nbsp;&nbsp; &nbsp; else</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; &nbsp;write (PInteger (Data[i])^ : 4); { вывод числа }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dispose (Data[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { освобождаем память, взятую для строки }</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Input_Array; { ввод данных }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; { вызов процедуры сортировки }</div><div class="code_line">&nbsp;&nbsp; &nbsp; if SORT_STR then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QuickSort (Data, CompareStrings, 1, N)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; { сортируем массив строк }</div><div class="code_line">&nbsp;&nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QuickSort (Data, CompareNumbers, 1, N);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; { сортируем массив чисел }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; View_Array; { вывод данных }</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=59376&amp;view=findpost&amp;p=445490</guid>
        <pubDate>Mon, 30 Aug 2004 12:41:08 +0000</pubDate>
        <title>Как упорядочить данные по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=59376&amp;view=findpost&amp;p=445490</link>
        <description><![CDATA[Romtek: Рассмотрим более сложный пример, с применением <span class="tag-color tag-color-named" data-value="orange" style="color: orange">быстрой сортировки</span>. Этот алгоритм рассчитан на большие массивы записей и очень эффективен в большинстве случаев, хотя его реализация и сложнее.<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: List; Lo, Hi: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;x, y: TInfo;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Sort (l, r: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, j: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x := A[(l + r) div 2];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i := l; j := r;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while Compare( A[i], x ) &#60; 0 do</div><div class="code_line">&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; while Compare( A[j], x ) &#62; 0 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dec (j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if i &#60;= j then</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; &nbsp;y := A[i]; A[i] := A[j]; A[j] := y; { поменять A[i] и A[j] значения местами }</div><div class="code_line">&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;dec(j);</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; until i &#62; j;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if l &#60; j then Sort (l, j);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; l := i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; until l &#62;= r;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Sort (Lo,Hi);</div><div class="code_line">end; {QuickSort}</div></ol></div></div></div></div><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">QuickSort (Data, 1, N); { сортировка массива записей от 1-й до N-й записи }</div></ol></div></div></div></div><br>
<br>
Бывают случаи, когда нужно сравнивать текст без учёта регистра. Тогда нужно применять функцию StrICmp вместо StrCmp (смотрите в исходнике программы).<br>
<hr>Исходник рабочего примера сортировки по имени, с форматированным выводом записей:]]></description>
        <author>Romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=59376&amp;view=findpost&amp;p=399640</guid>
        <pubDate>Sat, 10 Jul 2004 14:29:30 +0000</pubDate>
        <title>Как упорядочить данные по возрастанию?</title>
        <link>https://forum.sources.ru/index.php?showtopic=59376&amp;view=findpost&amp;p=399640</link>
        <description><![CDATA[Romtek: <span class='tag-size' data-value='10' style='font-size:10pt;'><strong class='tag-b'><span class="tag-color tag-color-named" data-value="blue" style="color: blue">Как упорядочить данные по возрастанию?</span> Пример для массива записей.</strong></span><br>
<br>
Программа показывает как отсортировать массив записей по возрасту.<br>
Так можно упорядочить <em class='tag-i'>любую</em> структуру данных. Надо только позаботиться о том, по какому критерию надо сортировать.<br>
По убыванию? Пожалуйста&#33; Поменяйте знак сравнения в процедуре <em class='tag-i'>Compare</em>.<br>
Самая важная часть - сортировка массива записей - осуществляется процедурой <em class='tag-i'>Sort</em>. Её можно заменить на любой другой алгоритм сортировки (пузырьком, быстрая сортировка и другие). При замене процедуры сортировки на свою, вы должны внести саму часть сравнения в виде кода<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">if Compare (Data[i], Data[j]) &#62; 0 then</div></ol></div></div></div></div><br>
Процедуры ввода и вывода данных массива (<em class='tag-i'>InputData </em>и <em class='tag-i'>OuputData</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">program SortRec;</div><div class="code_line">&nbsp;</div><div class="code_line">const N = 4;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; TInfo = record</div><div class="code_line">&nbsp;&nbsp; &nbsp; Age: &nbsp;integer; { возраст }</div><div class="code_line">&nbsp;&nbsp; &nbsp; Name: string [20];</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; List = array [1..N] of TInfo; { массив записей содержит возраст и имя }</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Data: List;</div><div class="code_line">&nbsp;</div><div class="code_line">{ сравнивать по именам }</div><div class="code_line">function Compare (T1,T2: TInfo): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if T1.Name &#62; T2.Name then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Compare := 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if T1.Name = T2.Name then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compare := 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compare := -1</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">(* или:</div><div class="code_line">{ сравнивать по возрасту }</div><div class="code_line">function Compare (T1,T2: TInfo): integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if T1.Age &#62; T2.Age then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Compare := 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if T1.Age = T2.Age then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compare := 0</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Compare := -1</div><div class="code_line">end;</div><div class="code_line">*)</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Sort;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, j: integer;</div><div class="code_line">&nbsp;&nbsp;temp: TInfo;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;For I := 1 To Pred (N) Do</div><div class="code_line">&nbsp;&nbsp; &nbsp;For J := Succ (I) To N Do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Compare (Data[i], Data[j]) &#62; 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;temp := Data[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Data[i] := Data[j];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Data[j] := temp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;End;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure InputData;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;I: Integer;</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; with Data[I] do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Enter name: &#39;); readln (Name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Enter age: &#39;); &nbsp;readln (Age);</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure OuputData;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;I: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (&#39;Name&#39; : 10, &#39;Age&#39; : 30);</div><div class="code_line">&nbsp;&nbsp; &nbsp; for I := 1 to 40 do write (&#39;=&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; for I := 1 to N do</div><div class="code_line">&nbsp;&nbsp; &nbsp; with Data[I] do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write &nbsp; ( &nbsp; I : 2 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write &nbsp; ( &#39; &#39; : 4, Name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln ( Age : 34 - Length (Name));</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">begin { Main }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ заполнение массива записей }</div><div class="code_line">&nbsp;&nbsp; &nbsp;InputData;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ сортировка массива записей }</div><div class="code_line">&nbsp;&nbsp; &nbsp;Sort;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ форматированный вывод на экран массива записей }</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuputData;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><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">&nbsp;&nbsp; &nbsp; &nbsp;Name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Age</div><div class="code_line">========================================</div><div class="code_line">&nbsp;1 &nbsp; &nbsp;Anton &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 23</div><div class="code_line">&nbsp;2 &nbsp; &nbsp;Denis &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 12</div><div class="code_line">&nbsp;3 &nbsp; &nbsp;Rostik &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;19</div><div class="code_line">&nbsp;4 &nbsp; &nbsp;Vasilij &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 27</div></ol></div></div></div></div>]]></description>
        <author>Romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      </channel>
      </rss>
	