Сортировка двумерного массива - Free Pascal
Формулировка задачи:
Доброго времени суток. Помогите отсортировать двумерный массив таким образом.
И сходный масссив
5 6 3 3
8 6 3 1
19 16 5 2
21 31 12 1
3 31 12 3
И начинаем сортировать по последнему столбцу, далее по третьему (предпоследнему), далее по второму, и далее по первому. Т.е. результатом должно стать:
8 6 3 1
21 31 12 1
19 16 5 2
5 6 3 3
3 31 12 3
Заранее благодарен за ответ.
Решение задачи: «Сортировка двумерного массива»
textual
Листинг программы
type
TIntMatrix = array of array of Integer;
TCmpLineFunc = function(const m: TIntMatrix; i, j: Integer): Integer;
procedure mSortLines(var m: TIntMatrix; Cmp: TCmpLineFunc);
var
i, j: Integer;
t: array of Integer;
begin
for i:=High(m) downto Low(m)+1 do
for j:=Low(m)+1 to i do
if Cmp(m,j-1,j)>0 then begin
t:=m[j-1]; m[j-1]:=m[j]; m[j]:=t;
end;
end;
function Cmp(const m: TIntMatrix; i, j: Integer): Integer;
var k: Integer;
begin
k:=High(m[0]); while (k>=Low(m[0])) and (m[i,k]=m[j,k]) do Dec(k);
if k<Low(m[0]) then Cmp:=0 else Cmp:=m[i,k]-m[j,k];
end;
procedure mWrite(const m: TIntMatrix; W: Integer);
var i, j: Integer;
begin
for i:=Low(m) to High(m) do begin
for j:=Low(m[i]) to High(m[i]) do Write(m[i,j]:W); WriteLn;
end;
end;
var
m, n, i, j: Integer;
a: TIntMatrix;
begin
Randomize;
Write('Введите m и n: '); ReadLn(m,n);
SetLength(a,m,n);
for i:=Low(a) to High(a) do for j:=Low(a[i]) to High(a[i]) do
a[i,j]:=Random(100);
WriteLn('A='); mWrite(a,4);
mSortLines(a,@Cmp);
WriteLn('A''='); mWrite(a,4);
end.
Объяснение кода листинга программы
- Объявление типа данных TIntMatrix для двумерного массива целых чисел
- Объявление процедуры mSortLines для сортировки строк массива m, используя функцию сравнения Cmp
- Объявление функции Cmp для сравнения элементов массива m
- Объявление процедуры mWrite для вывода элементов массива m на экран
- Объявление переменных m, n, i, j, a для выполнения задачи
- Инициализация генератора случайных чисел
- Ввод размеров массива m и n с помощью функции ReadLn
- Создание двумерного массива a с помощью функции SetLength
- Заполнение массива a случайными числами с помощью цикла
- Вывод массива a на экран с помощью функции mWrite
- Сортировка строк массива a с помощью процедуры mSortLines
- Вывод отсортированного массива a на экран с помощью функции mWrite
- Конец программы