10 баллов. Нужно было написать код программы, которая продемонстрирует работу сортировки...

0 голосов
52 просмотров

10 баллов. Нужно было написать код программы, которая продемонстрирует работу сортировки вставками. (Т.е. прочитать массив и затем выводить его после каждой вставки). Написала, вроде - бы хорошо работает. Но вот почему - то выводит одну и ту же строку по два раза...
type
array_type = array [1..1000] of int64;

procedure InsertSort(var a: array_type; n: int64);
var
i, j, l, s: integer;
begin
for i := 2 to n do
begin
l := a[i];
j := i - 1;
while (j >= 1) and (a[j] > l) do
begin
a[j + 1] := a[j];
j := j - 1;
end;
a[j + 1] := l;
for s := 1 to n do write(a[s], ' ');
writeln();
end;
end;

var
a: array_type;
i, n: int64;

begin
readln(n);
for i := 1 to n do read(a[i]);
InsertSort(a, n);
for i := 1 to n do write(a[i], ' ');
end.


Информатика | 52 просмотров
0

Какой компилятор?

0

ABC.NET, очевидно

0

Наверное, не плохо было бы выводить массив только тогда, когда элементы меняются местами. А не каждый раз. 5 элементов в массиве, все на своих местах - выведет массив 5 раз в процедуре и ещё один в конце программы

0

У тебя в процедуре был цикл for, он выводил твой массив в лишний раз. Я исправил.

Дан 1 ответ
0 голосов
Правильный ответ

Потому что у тебя идет печать массива для каждого элемента, даже если он стоит в правильном порядке относительно предыдущего, а в таком случае вставки не происходит. Добавь вот это в цикл функции:


image
(812 баллов)
0

это перебросит на следующую итерацию цикла

0

Можно было, кстати, условие поставить сразу после For i:= 2 to n do

0

Эффект был бы тот же самый. А countinue далеко не все знают))

0

Возможно, но continue штука полезная, быть может, поможет автору в будущем)

0

Спасибо большое!