Array89. Дан массив размера $$N$$, все элементы которого, кроме одного, упорядочены по убыванию. Сделать массив упорядоченным, переместив элемент, нарушающий упорядоченность, на новую позицию.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
program Array89; var a : array[1..10] of Integer; N,i:Integer; begin Write('N: '); Readln(N); Writeln('A: '); for i:=1 to N do begin write(i,' :'); readln(a[i]); end; for i:=N-1 downto 1 do if a[i]<a[i+1] then begin a[i+1]:=a[i]+a[i+1]; a[i]:=a[i+1]-a[i]; a[i+1]:=a[i+1]-a[i]; end; for i:=2 to N do if a[i-1]<a[i] then begin a[i-1]:=a[i]+a[i-1]; a[i]:=a[i-1]-a[i]; a[i-1]:=a[i-1]-a[i]; end; for i:=1 to N do writeln(i,' :',a[i]); end. |
Решение от olegst1975:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
type mas=array [1..10]of real; var n,i:integer; a:mas; procedure sink(var a:mas;i:integer); begin if (i=1)or(a[i]<a[i-1]) then exit; a[i]:=a[i]+a[i-1]; a[i-1]:=a[i]-a[i-1]; a[i]:=a[i]-a[i-1]; sink(a,i-1); end; begin readln(n); for i:=1 to n do readln(a[i]); for i:=2 to n do sink(a,i); for i:=1 to n do writeln(a[i]); end. |
Решение рекурсивное:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
type mas=array [1..10]of real; var n,i:integer; a:mas; procedure swap(var i1,i2:real); begin i1:=i1+i2; i2:=i1-i2; i1:=i1-i2; end; procedure sink(var a:mas;n,i:integer); begin if i>1 then if i<=n then if (a[i-1]>a[i]) then sink(a,n,i-1) else begin swap(a[i],a[i-1]); sink(a,n,i+1); end else sink(a,n,n); end; begin readln(n); for i:=1 to n do readln(a[i]); sink(a,n,n); for i:=1 to n do writeln(a[i]); end. |
Решение без использования циклов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
type mas=array [1..10]of real; var n,i:integer; a:mas; procedure swap(var i1,i2:real); begin i1:=i1+i2; i2:=i1-i2; i1:=i1-i2; end; procedure sink(var a:mas;n,i,status:integer); begin case status of 1: begin if i<=n then begin Write(i,' : '); Readln(a[i]); sink(a,n,i+1,1); end else sink(a,n,n,2); end; 2: begin if i>1 then if i<=n then if (a[i-1]>a[i]) then sink(a,n,i-1,2) else begin swap(a[i],a[i-1]); sink(a,n,i+1,2); end else sink(a,n,n,2) else sink(a,n,1,3); end; 3:begin if i<=n then begin Writeln(i,' : ',a[i]); sink(a,n,i+1,3); end; end; end; end; begin readln(n); sink(a,n,1,1); end. |
Задачи из раздела Array можно посмотреть здесь.
[/crayon]
мне не нравиться запупск рекурсивной функции в цикле… как то это ресурсозатратно звучит 🙂
в шапку добавил решение где я избавляюсь, от запуска рекурсии в цикле, а потом я изабвился и от всех циклов… 🙂
ОГО! Ну не столько же за одно утро!.. «как то это ресурсозатратно звучит» — да, скорее применимо для сортировки всего массива, а не одно число поставить на место(решение с большииим запасом))
Хорошая задача, надо будет по-разбираться в вашем коде. Мое решение — сортировка вставками.