Даны два упорядоченные массива А и В.Образовать из элементов массива упорядоченный массив С.
Я их ввёл,а объеденить их в упорядоченный-не знаю.Как это попроще сделать?
Program z_1;
Uses Crt;
Const
nmax=10;
Type
mas=array[1..nmax] of integer;
Var
A,B:mas;
C:array [1..2*nmax] of integer;
na,nb,nc:integer;
i,j,k:integer;
{Процедура ввода массивов}Procedure vvod(var A: mas; n:byte);
begin
Write('Введите количество элементов массива: ');
ReadLn(n);
for i := 1to n dobegin
read(A[i])
end;
end;{vvod}Begin
ClrScr;
Writeln;
Writeln('Введите первый массив: ');
vvod(A,Na);
Writeln('Введите второй массив: ');
vvod(B,Nb);
end.
мисс_граффити
30.04.2007 18:26
Поиск -> сортировка слиянием
Rom1k
30.04.2007 18:44
искал,но ничего не нашёл(
2ral
30.04.2007 18:44
uses crt; var a,b,c,d,e,f,m,n,i:integer; bool:boolean; arn,arm,arf:array [1..100] of integer; begin clrscr; readln(n); for a:=1 to n do read(arn[a]); writeln; readln(m); for b:=1 to m do read(arm[b]); writeln; d:=0; a:=1; b:=1; i:=1; repeat inc(d); if (n>=a) and (m>=b) then begin if arn[a]<arm[b] then begin arf[i]:=arn[a]; inc(a); end else begin arf[i]:=arm[b]; inc(b); end; inc(i); end else begin if n<a then begin arf[i]:=arm[b]; inc(b); end else begin arf[i]:=arn[a]; inc(a); end; inc(i); end; until (d=n+m); for a:=1 to n+m do write(arf[a]:3); readln; readln; end.
может такой вариант?!
Rom1k
30.04.2007 18:50
ээм.вообще ничего не понятно.Есть нормальный рабочий вариант слияния двух массивов в один с упорядочиванием?
Rom1k
30.04.2007 19:30
помогите пожалуйста.оч надо!!!
volvo
30.04.2007 19:33
Внешняя сортировка Скачай исходник, и замени работу с файлами на работу с массивами ...
2ral
30.04.2007 19:38
uses crt; var a,b,c,d,e,f,h,n,m,max:integer; bool:boolean; ar1,ar2,arl:array [1..500] of integer; begin clrscr; randomize; readln(n,m); bool:=true; max:=-1; f:=1; for b:=1 to n do begin ar1[b]:=random(9); ar1[b]:=ar1[b]+1; write(ar1[b]:3); end; writeln; for b:=1 to m do begin ar2[b]:=random(9); ar2[b]:=ar2[b]+1; write(ar2[b]:3); end; writeln; for b:=1 to n+m do begin for c:=1 to n do if max<=ar1[c] then begin max:=ar1[c]; e:=c; bool:=true; end; for c:=1 to m do if max<=ar2[c] then begin max:=ar2[c]; e:=c; bool:=false; end; arl[f]:=max; inc(f); max:=-5; if bool then ar1[e]:=-2 else ar2[e]:=-2; e:=0; end; for b:=1 to n+m do write(arl[b]:3); readln; end.
а так?
мисс_граффити
30.04.2007 19:45
М
2ral, пользуйся, пожалуйста, тегами для обрамления кода!
Rom1k
30.04.2007 19:52
Цитата(volvo @ 30.04.2007 16:33)
Внешняя сортировка Скачай исходник, и замени работу с файлами на работу с массивами ...
скачал,посмотрнл,прочитал,попытался понять,но опять же ничего не получается.Вот написал: только не знаю,почему не правильно работает!!!
Program z_1;
Uses Crt;
Const
n=10;
Type
mas=array[1..n] of integer;
Var
A,B:mas;
C:array [1..2*n] of integer;
i,j,k:integer;
na,nb:byte;
{Процедура ввода массивов}Procedure vvod(var A: mas; n:byte);
begin
Write('Введите количество элементов массива: ');
ReadLn(n);
WriteLn('Элементы ');
for i := 1to n dobegin
read(A[i])
end;
end;{vvod}Begin
ClrScr;
Writeln;
Writeln('Введите первый массив: ');
vvod(A,na);
Writeln('Введите второй массив: ');
vvod(B,nb);
For k := 1to2*n dobeginif (i <= n) and (j <= n) thenif a[i] <= b[j] thenbegin
c[k] := a[i];
inc(i)
endelsebegin
c[k] := b[j];
inc(j)
end ;
end;
elseif i > n thenbegin
c[k] := b[j];
inc(j)
endelsebegin
c[k] := a[i];
inc(i)
endend;
{Вывод полученного массива}
Writeln('Массив полученный при объединении массивов А и В: ');
for k:=1to n*2do
writeln('C[',k,'] = ',c[k]);
readkey;
End.
Добавлено через 18 мин. с ума сойти.пол дня с этой задачей,а толку-нет(
volvo
30.04.2007 20:16
const
size = 10;
type
arrType = array[1 .. size] of integer;
buffer = array[1 .. 2*size] of integer;
procedure merge(var a: buffer; b, c: arrType);
var p, p_b, p_c: integer;
begin
p_b := 1; p_c := 1;
p := 1;
while (p_b <= size) and (p_c <= size) dobeginif b[p_b] < c[p_c] thenbegin
a[p] := b[p_b]; inc(p); inc(p_b);
endelsebegin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;
while p_b <= size + 1dobegin
a[p] := b[p_b]; inc(p); inc(p_b);
end;
while p_c <= size + 1dobegin
a[p] := c[p_c]; inc(p); inc(p_c);
end;
end;
const
one: arrType = (1, 3, 4, 5, 6, 7, 7, 8, 10, 11);
two: arrType = (1, 2, 4, 5, 5, 7, 8, 11, 11, 11);
var
res: buffer;
i: integer;
begin
merge(res, one, two);
for i := 1to2 * size do
write(res[i]:3);
writeln
end.
Так лучше? (вводить массивы сам ты умеешь...)
Rom1k
30.04.2007 20:50
тут получается,что в обоих массивах надо одинаковое кол-во элементов вводить? это типа обязательное условие???
volvo
30.04.2007 20:59
Нет, не обязательное... А если тебе это надо было, я как догадаться должен? Передавай количество элементов в процедуру Merge, вот так: