Даны два упорядоченные массива А и В.Образовать из элементов массива упорядоченный массив С.
Я их ввёл,а объеденить их в упорядоченный-не знаю.Как это попроще сделать?
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 := 1 to n do begin 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 := 1 to n do begin read(A[i]) end; end;{vvod}
Begin ClrScr; Writeln; Writeln('Введите первый массив: '); vvod(A,na); Writeln('Введите второй массив: '); vvod(B,nb); For k := 1 to 2*n do begin if (i <= n) and (j <= n) then if a[i] <= b[j] then begin c[k] := a[i]; inc(i) end else begin c[k] := b[j]; inc(j) end ; end; else if i > n then begin c[k] := b[j]; inc(j) end else begin c[k] := a[i]; inc(i) end end; {Вывод полученного массива} Writeln('Массив полученный при объединении массивов А и В: '); for k:=1 to n*2 do 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) do begin if b[p_b] < c[p_c] then begin a[p] := b[p_b]; inc(p); inc(p_b); end else begin a[p] := c[p_c]; inc(p); inc(p_c); end; end;
while p_b <= size + 1 do begin a[p] := b[p_b]; inc(p); inc(p_b); end; while p_c <= size + 1 do begin 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 := 1 to 2 * size do write(res[i]:3); writeln end.
Так лучше? (вводить массивы сам ты умеешь...)
Rom1k
30.04.2007 20:50
тут получается,что в обоих массивах надо одинаковое кол-во элементов вводить? это типа обязательное условие???
volvo
30.04.2007 20:59
Нет, не обязательное... А если тебе это надо было, я как догадаться должен? Передавай количество элементов в процедуру Merge, вот так:
procedure merge(var a: buffer; b, c: arrType; n_b, n_c: integer); var p, p_b, p_c: integer; begin p_b := 1; p_c := 1; p := 1;
while (p_b <= n_b) and (p_c <= n_c) do begin if b[p_b] < c[p_c] then begin a[p] := b[p_b]; inc(p); inc(p_b); end else begin a[p] := c[p_c]; inc(p); inc(p_c); end; end;
while p_b <= n_b do begin a[p] := b[p_b]; inc(p); inc(p_b); end; while p_c <= n_c do begin a[p] := c[p_c]; inc(p); inc(p_c); end; end;
Rom1k
30.04.2007 21:06
крыша у меня едет.Что я ещё мог здесь неправильно сделать???
program n1; uses crt; 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) do begin if b[p_b] < c[p_c] then begin a[p] := b[p_b]; inc(p); inc(p_b); end else begin a[p] := c[p_c]; inc(p); inc(p_c); end; end;
while p_b <= size + 1 do begin a[p] := b[p_b]; inc(p); inc(p_b); end; while p_c <= size + 1 do begin a[p] := c[p_c]; inc(p); inc(p_c); end; end;
var one: arrType; two: arrType; res: buffer; i,j,k,na,nb: integer; begin write('kol-vo el 1 mas '); readLn(na); for i:=1 to na do read(one[i]); write('kol-vo el 2 mas '); readLn(nb); for i:=1 to nb do read(two[j]); merge(res, one, two); for i := 1 to 2 * size do write(res[k]:3); writeln end.
volvo
30.04.2007 21:11
Я не знаю, что ты мог сделать неправильно... Как видно, тебя просто не интересует то, что тебе подсказывают? Ну, так разбирайся сам.
Rom1k
30.04.2007 21:14
я пытаюсь разобраться.а что я не заметил,почему не интересует,это ведь надо мне...Щас.ещё раз попытаюсь найти ошибки!
Добавлено через 4 мин. я передал количество элементов в процедуру,но он мне выводит после компиляции в ответе все нули(
Rom1k
1.05.2007 0:02
не у кого не осталось сил мне помочь?
klem4
1.05.2007 0:48
Тебе же volvo все написал, измени процедуру merge на последний вариант c заголовком