Изучаю сортировку подсчётом на Паскале
Только начала разбираться в программировании. Дан псевдокод
var
arr: array[-1000..1000] of longint; //arr[i] - количество чисел i в массиве
i, j, n, x: longint;
begin
readln(n);
for i := -1000 to 1000 do
arr[i] := 0;
for i := 1 to n do
begin
read(x);
inc(arr[x]);
end;
for i := -1000 to 1000 do
for j := 1 to arr[i] do
write(i, ' ');
end.
По сути он работает как сортировщик подсчётом, но я категорически не пойму, каким способом он его производит. Я понимаю, как вводятся и выводятся числа, но как они сортируются - непонятно. Может кто-нибудь популярно объяснить?
Ответы (2 шт):
Ну сортировки как таковой тут и не производится.
for i := 1 to n do
begin
read(x);
inc(arr[x]);
end;
Здесь, элемент массива, соответствующий введенному числу инкрементируем. (Если число было введено H раз, то это элемент будет равен H).
for i := -1000 to 1000 do
for j := 1 to arr[i] do
write(i, ' ');
А здесь — проходимся по каждому элементу массива. И проходим циклом от 1 до значения элемента массива, а в этот элемент ранее было записано количество таких чисел. Если значение было 0(таких чисел не было введено, то мы ничего и не выведем), если значение было, например 2 — то выведем два раза подряд это число.
Вроде постарался описать понятным языком...
begin
// сортировка подсчётом
var n := ReadInteger('Укажите количество чисел:');
var a := ReadArrInteger('Вводите:', n);
var k := a.Max;
var c := |0| * (k + 1);
for var i := 0 to a.High do
c[a[i]] += 1;
var b := 0;
for var j := 0 to k do
for var i := 0 to c[j] - 1 do
begin
a[b] := j;
b += 1
end;
a.Println
end.
