Сортировка массива и бинарный поиск

Задача: 

Сформировать массив из случайных целых чисел в указанном пользователем диапазоне. Сообщить, есть ли в нем элемент, также указанный пользователем. Перед поиском элементы массива отсортировать (при этом оставив исходный массив без изменений), после чего воспользоваться бинарным поиском. В программе должны быть три процедуры - заполнение массива, сортировка, поиск элемента.

Алгоритм решения задачи: 

В основной ветке программы вызываются процедуры заполнения массива и сортировки. Процедура бинарного поиска вызывается уже из процедуры сортировки. Это связано с тем, что требуется оставить исходный массив неизменным, в следствие чего в процедуру сортировки передается не исходный массив, а его копия. Поэтому из основной ветке программы изменения сделанные процедурой сортировки "не видны". А вот вызов процедуры поиска из процедуры сортировки позволяет передать в первую уже измененный массив.

Алгоритм бинарного поиска осуществляется исключительно для отсортированных по возрастанию или убыванию массивов и заключается в следующем. Берется элемент в середине массива. Если искомый элемент больше взятого из середины (в случае массива отсортированного по возрастанию), то далее поиск будет продолжен в правой части от среднего; если меньше, то в левой. Эта часть далее снова делится пополам и сравнивается ее середина с искомым элементом и т. д. В конце концов если искомый элемент есть в массиве, то очередная середина отрезка массива с ним рано или поздно совпадет. Если же его нет, то границы отрезка поиска пересекутся и цикл поиска следует прервать.

Программа на языке Паскаль: 

const N = 20;
type arr = array[1..N] of integer;
var
    a: arr;
    i: byte;
    p,q,e: integer;
 
procedure fill(var b: arr; min,max: integer);
    var k: byte;
    begin
        randomize;
        for k:=1 to N do b[k] := random(max-min) + min;
    end;
 
procedure search(var c: arr; elem: integer);
    var m,i,j: integer;
    begin
        m := N div 2;
        i := 1;
        j := N;
        while (c[m] <> elem) and (i <= j) do begin
            if elem > c[m] then i := m + 1
            else j := m - 1;
            m := (i+j) div 2;
        end;
        if i > j then writeln('No')
        else writeln('Yes');
    end;
 
procedure sort(c: arr; elem: integer);
    var j,k,m,id: byte;
    begin
        m := N;
        while m > 1 do begin
            id := 1;
            for j := 2 to m do
                if c[j] > c[id] then id := j;
            k := c[id];
            c[id] := c[m];
            c[m] := k;
            m := m - 1;
        end;
        search(c,elem);
    end;
 
begin
    write('Min: '); readln(p);
    write('Max: '); readln(q);
    write('Element: '); readln(e);
    fill(a, p,q);
    sort(a, e);
    for i:=1 to N do write(a[i],' ');
    writeln;
end.

Примеры выполнения программы:

Min: 10
Max: 25
Element: 15
No
13 17 24 16 22 22 13 17 24 23 24 24 10 18 10 12 16 20 10 20
Min: 10
Max: 25
Element: 15
Yes
18 10 19 14 21 15 15 11 21 17 21 18 17 16 24 16 14 20 10 14