Песни о Паскале | страница 170
> { Внимание! Параметр-массив передается по ссылке! }
>procedure BubbleSort (var arg: TGolds);
>var i, j, t: Integer;
>begin
>for i:= 1 to CSize-1 do { внешний цикл }
> for j:= 1 to CSize-1 do { внутренний цикл }
> { если текущий элемент больше следующего …}
> if arg[j] > arg[j+1] then begin
> { то меняем местами соседние элементы }
> t:= arg[j]; { временно запоминаем }
> arg[j]:= arg[j+1]; { следующий -> в текущий }
> arg[j+1]:= t; { текущий -> в следующий }
> end;
>end;
>var i:integer; { для индекса в главной программе }
>begin {--- Главная программа ---}
> { заполняем массив случайным образом }
> Randomize;
> for i:=1 to CSize do Golds [i]:= 1+Random(1000);
> { распечатаем до сортировки }
> Writeln('До сортировки:');
> for i:=1 to CSize do Writeln(Golds [i]:3);
> { сортируем }
> BubbleSort(Golds);
> { распечатаем после сортировки }
> Writeln('После сортировки:');
> for i:=1 to CSize do Writeln(Golds [i]:3);
> Readln;
>end.
Обратите внимание: сортируемый массив передан в процедуру по ссылке VAR. Передача в процедуры массивов, множеств, строк и других сложных типов данных по ссылкам CONST и VAR — обычная практика. Это повышает скорость работы программ и уменьшает объём памяти, занимаемый параматрами.
При должном внимании вы обнаружите в этой сортировке небольшой изъян, суть которого такова. После отработки первого внутреннего цикла самый большой элемент окажется на последнем месте. А значит, на втором внутреннем цикле нет смысла сравнивать два последних элемента. На третьем проходе соответственно нет смысла сравнивать три последних элемента, – они уже лежат в нужном порядке. На этих сравнениях мы зря теряем время. Порок этот легко устранить, если поправить внутренний цикл так:
> for j:= 1 to CSize – i do { внутренний цикл }
Теперь каждый следующий внутренний цикл будет на единицу короче предыдущего (ведь счетчик внешнего цикла I растет). В следующей программе мы так и сделаем.
Рассмотрев хитрости пузырьковой сортировки, поможем теперь морским романтикам. Напишем программу для справедливой дележки золотых слитков. Основная работа уже проделана, – мы смогли отсортировать массив. Осталось лишь распечатать веса тех кусков, что достанутся каждому из пиратов. Известно, что первому пирату достанется первый и последний слитки, второму – второй и предпоследний и так далее. Иначе говоря, I–му пирату достанутся слитки с номерами I и CSize+1-I. Программа «P_41_2» «делит слитки», распечатывая после сортировки веса соответствующих пар.