|
|
Строка 2: |
Строка 2: |
|
| |
|
| [[Стандартные задачи на одномерные массивы]] | | [[Стандартные задачи на одномерные массивы]] |
|
| |
|
| |
|
| |
|
| |
| = Стандартные задачи на одномерные массивы =
| |
|
| |
| == Простейшие алгоритмы ==
| |
|
| |
| === №1. Вывод массива ===
| |
| <source lang="pascal">procedure Println<T>(a: array of T; delim: string := ' ');
| |
| begin
| |
| foreach x: T in a do
| |
| write(x, delim);
| |
| writeln;
| |
| end;
| |
| </source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=DaZzz/Arrays/1.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №2. Заполнение массива случайными числами ===
| |
| <source lang="pascal">procedure CreateRandomArray(var a: array of integer; n: integer);
| |
| begin
| |
| SetLength(a,n);
| |
| for var i:=0 to n-1 do
| |
| a[i] := random(100);
| |
| end;</source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=DaZzz/Arrays/2.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №3. Инвертирование массива ===
| |
| <source lang="pascal">procedure Invert<T>(a: array of T);
| |
| begin
| |
| var n := a.Length;
| |
| for var i:=0 to n div 2 - 1 do
| |
| Swap(a[i],a[n-i-1]);
| |
| end; </source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=DaZzz/Arrays/3.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №4. Поиск элемента по заданному значению ===
| |
| <source lang="pascal">// С помощью for
| |
| function Find<T>(a: array of T; x: T): integer;
| |
| begin
| |
| Result := -1;
| |
| for var i := 0 to a.Length - 1 do
| |
| if a[i] = x then
| |
| begin
| |
| Result := i;
| |
| break;
| |
| end;
| |
| end;
| |
|
| |
| // С помощью while
| |
| function FindWhile<T>(a: array of T; x: T): integer;
| |
| begin
| |
| var n := a.Length;
| |
| var i := 0;
| |
| while (i<n) and (a[i]<>x) do
| |
| i += 1;
| |
| if i=n then
| |
| Result := -1
| |
| else Result := i;
| |
| end;
| |
|
| |
| // №4a. Поиск с барьером
| |
| function FindWithBarrier<T>(a: array of T; n: integer; x: T): integer;
| |
| begin
| |
| Assert((0 < n) and (n < a.Length));
| |
| a[n] := x; // барьерный элемент равен разыскиваему
| |
| var i := 0;
| |
| while a[i]<>x do
| |
| i += 1;
| |
| if i=n then
| |
| Result := -1
| |
| else Result := i;
| |
| end;</source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=DaZzz/Arrays/4.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №5. Минимальный элемент и его индекс ===
| |
| <source lang="pascal">procedure MinElem(a: array of integer; var min: integer; var minind: integer);
| |
| begin
| |
| min := a[0];
| |
| minind := 0;
| |
| for var i:=1 to a.Length-1 do
| |
| if a[i]<min then
| |
| begin
| |
| min := a[i];
| |
| minind := i;
| |
| end;
| |
| end;</source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=DaZzz/Arrays/5.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| ==Сдвиги, вставка, удаление==
| |
| === №6. Сдвиг влево ===
| |
| <source lang="pascal">procedure ShiftLeft<T>(a: array of T);
| |
| begin
| |
| for var i:=0 to a.Length-2 do
| |
| a[i] := a[i+1];
| |
| a[a.Length-1] := default(T);
| |
| end;</source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=DaZzz/Arrays/6.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №7. Сдвиг вправо ===
| |
| <source lang="pascal">
| |
| procedure ShiftRight<T>(a: array of T);
| |
| begin
| |
| for var i := a.Length-1 downto 1 do
| |
| a[i] := a[i-1];
| |
| a[0] := default(T);
| |
| end;
| |
| </source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=PacVlad/ShiftRight.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №8. Циклический сдвиг вправо ===
| |
| <source lang="pascal">
| |
| procedure CycleShiftRight<T>(a: array of T);
| |
| begin
| |
| var v := a[a.Length-1];
| |
| for var i := a.Length downto 1 do
| |
| a[i] := a[i-1];
| |
| a[0] := v;
| |
| end;
| |
| </source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=PacVlad/CycleShiftRight.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №9. Удаление k-того ===
| |
| <source lang="pascal">
| |
| procedure Delete<T>(a: array of T; var n: integer; k: integer);
| |
| begin
| |
| Assert((0<=k) and (k<n))
| |
| Assert((0<=n) and (n<=a.Length));
| |
| for var i := k to n-2 do
| |
| a[i] := a[i+1];
| |
| a[n-1] := default(T);
| |
| n -= 1;
| |
| end;
| |
| </source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=PacVlad/Delete.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| === №10. Вставка на k-тое место ===
| |
| <source lang="pascal">
| |
| procedure Insert<T>(a: array of T; var n: integer; k: integer; value: T);
| |
| begin
| |
| Assert((0<=k) and (k<=n) and (n<a.Length));
| |
| for var i := n-1 downto k do
| |
| a[i+1] := a[i];
| |
| a[k] := value;
| |
| n += 1;
| |
| end;
| |
| </source>
| |
|
| |
| [http://pascalabc.net/WDE/?shared=PacVlad/Insert.pas Ссылка на алгоритм в среде WDE]
| |
|
| |
| == Слияние упорядоченных и бинарный поиск в упорядоченном массиве==
| |
| === №11. Слияние двух упорядоченных в один упорядоченный ===
| |
| <source lang="pascal">
| |
| // a,b упорядочены по возрастанию
| |
| function Merge(a,b: array of real; na,nb: integer): array of real;
| |
| begin
| |
| Assert((0 < na) and (na < a.Length));
| |
| Assert((0 < nb) and (nb < b.Length));
| |
| a[na] := real.MaxValue;
| |
| b[nb] := real.MaxValue;
| |
| var c := new integer[na + nb];
| |
| var ia := 0;
| |
| var ib := 0;
| |
| for var ic := 0 to na + nb - 1 do
| |
| if a[ia]<b[ib] then
| |
| begin
| |
| c[ic] := a[ia];
| |
| ia += 1;
| |
| end
| |
| else
| |
| begin
| |
| c[ic] := b[ib];
| |
| ib += 1;
| |
| end;
| |
| Result := c;
| |
| end;
| |
| </source>
| |
|
| |
| === №12. Поиск в упорядоченном массиве ===
| |
| <source lang="pascal">
| |
| function BinarySearch(a: array of integer; x: integer): integer;
| |
| begin
| |
| var k: integer;
| |
| var i := 0;
| |
| var j := a.Length-1;
| |
| repeat
| |
| k := (i+j) div 2;
| |
| if x>a[k] then
| |
| i := k + 1
| |
| else j := k - 1;
| |
| until (a[k]=x) or (i>j);
| |
| if a[k]=x then
| |
| Result := k
| |
| else Result := -1;
| |
| end;
| |
| </source>
| |
|
| |
| == Сортировка массивов ==
| |
|
| |
| === №13. Сортировка выбором ===
| |
| <source lang="pascal">
| |
| procedure SortByChoice(a: array of integer);
| |
| begin
| |
| for var i := 0 to a.Length - 2 do
| |
| begin
| |
| var min := a[i];
| |
| var imin := i;
| |
| for var j := i + 1 to a.Length - 1 do
| |
| if a[j] < min then
| |
| begin
| |
| min := a[i];
| |
| imin := j;
| |
| end;
| |
| a[imin] := a[i];
| |
| a[i] := min;
| |
| end;
| |
| end;
| |
| </source>
| |
|
| |
| === №14. Пузырьковая сортировка ===
| |
| <source lang="pascal">
| |
| procedure BubbleSort(a: array of integer);
| |
| begin
| |
| var n := a.Length;
| |
| for var i := 0 to n - 2 do
| |
| for var j := n - 1 downto i + 1 do
| |
| if a[j] < a[j - 1] then
| |
| Swap(a[j], a[j - 1]);
| |
| end;
| |
|
| |
| procedure BubbleSort2(a: array of integer);
| |
| begin
| |
| var i := a.Length - 1;
| |
| var q: boolean;
| |
| repeat
| |
| q := true;
| |
| for var j := 0 to i - 1 do
| |
| if a[j + 1] < a[j] then
| |
| begin
| |
| Swap(a[j + 1], a[j]);
| |
| q := false;
| |
| end;
| |
| i -= 1;
| |
| until q;
| |
| end;
| |
| </source>
| |
|
| |
| === №15. Сортировка вставками ===
| |
| <source lang="pascal">
| |
| procedure SortByInsert(a: array of integer);
| |
| begin
| |
| for var i := 1 to a.Length - 1 do
| |
| begin
| |
| var x := a[i];
| |
| var j := i - 1;
| |
| while (j >= 0) and (x < a[j]) do
| |
| begin
| |
| a[j + 1] := a[j];
| |
| j -= 1;
| |
| end;
| |
| a[j + 1] := x;
| |
| end;
| |
| end;
| |
| </source>
| |
|
| |
| == Использование процедурных типов в задачах на массивы ==
| |
| Пусть сделаны следующие описания:
| |
| <source lang="pascal">
| |
| type IPredicate = function(x: integer): boolean;
| |
|
| |
| // Примеры предикатов
| |
| function Even(x: integer): boolean;
| |
| begin
| |
| result := not odd(x);
| |
| end;
| |
|
| |
| function IsPositive(x: integer): boolean;
| |
| begin
| |
| Result := x > 0;
| |
| end;
| |
| </source>
| |
|
| |
| === №16. Поиск по условию ===
| |
| <source lang="pascal">
| |
| function FindPred(a: array of integer; pred: IPredicate): integer;
| |
| begin
| |
| var n := a.Length;
| |
| var i := 0;
| |
| while (i < n) and not pred(a[i]) do
| |
| i += 1;
| |
| if i = n then
| |
| Result := -1
| |
| else Result := i;
| |
| end;
| |
| </source>
| |
|
| |
| === №17. Количество по условию ===
| |
| <source lang="pascal">
| |
| function CountPred(a: array of integer; pred: IPredicate): integer;
| |
| begin
| |
| Result := 0;
| |
| for var i := 0 to a.Length - 1 do
| |
| if pred(a[i]) then
| |
| Result += 1;
| |
| end;
| |
| </source>
| |
|
| |
| === №18. Условный минимум ===
| |
| <source lang="pascal">
| |
| procedure MinElemPred(a: array of integer; pred: IPredicate; var min, imin: integer);
| |
| begin
| |
| min := Integer.MaxValue;
| |
| imin := -1;
| |
| for var i := 1 to a.length - 1 do
| |
| if pred(a[i]) and (a[i] < min) then
| |
| begin
| |
| min := a[i];
| |
| imin := i;
| |
| end;
| |
| end;
| |
| </source>
| |
|
| |
| === №19. Удаление по условию ===
| |
| <source lang="pascal">
| |
| procedure DeleteAll(a: array of integer; var n: integer; pred: IPredicate);
| |
| begin
| |
| Assert((0 < n) and (n <= a.Length));
| |
| var j := 0;
| |
| for var i := 0 to n - 1 do
| |
| if not pred(a[i]) then
| |
| begin
| |
| a[j] := a[i];
| |
| j += 1;
| |
| end;
| |
| n := j;
| |
| end;
| |
| </source>
| |
|
| |
|
| |
| ---- | | ---- |
|
| |
|
| © Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав | | © Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав |