Даны два упорядоченные массива А и В.Образовать из элементов массива упорядоченный массив С.
Я их ввёл,а объеденить их в упорядоченный-не знаю.Как это попроще сделать?
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.
Поиск -> сортировка слиянием
искал,но ничего не нашёл(
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.
может такой вариант?!
ээм.вообще ничего не понятно.Есть нормальный рабочий вариант слияния двух массивов в один с упорядочиванием?
помогите пожалуйста.оч надо!!!
http://forum.pascal.net.ru/index.php?showtopic=16911
Скачай исходник, и замени работу с файлами на работу с массивами ...
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.
а так?
М | 2ral, пользуйся, пожалуйста, тегами для обрамления кода! |
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.
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.
тут получается,что в обоих массивах надо одинаковое кол-во элементов вводить? это типа обязательное условие???
Нет, не обязательное... А если тебе это надо было, я как догадаться должен? Передавай количество элементов в процедуру 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;
крыша у меня едет.Что я ещё мог здесь неправильно сделать???
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.
Я не знаю, что ты мог сделать неправильно... Как видно, тебя просто не интересует то, что тебе подсказывают? Ну, так разбирайся сам.
я пытаюсь разобраться.а что я не заметил,почему не интересует,это ведь надо мне...Щас.ещё раз попытаюсь найти ошибки!
Добавлено через 4 мин.
я передал количество элементов в процедуру,но он мне выводит после компиляции в ответе все нули(
не у кого не осталось сил мне помочь?
Тебе же volvo все написал, измени процедуру merge на последний вариант c заголовком
я так и сделал но почему-то процедура не упорядочивает их.и при выходе выводит цифры,а после них очень много нулей
Приаттач исходник полностью, файлом только, а то и так страница еле грузится.
я всё перепроверил.теперь прога работает правильно только как мне в конце убрать эту кучу нулей? файл прекрепил!!!
Прикрепленные файлы
KUR_1.PAS ( 1007 байт )
Кол-во скачиваний: 189
Присоединяй программу полностью, и данные, с которыми тестировал - тоже...
...
не понял что-то?! и ещё..я её тестю с большими числами,она мне не правильно их сортирует
Кроме этого:
замени
for i := 1 to 2 * size do
write(res[i]:3);
for i := 1 to n_a + n_b do
write(res[i]:3);
Дальше больше
вот полностью переделанный вариант,да и он не работает правильно.
Может сортировка не правильная? или что-то ещё?
Прикрепленные файлы
KUR_1.PAS ( 1023 байт )
Кол-во скачиваний: 190
При каких данных-то ?!
Ты можешь ДАННЫЕ, с которыми тестируешь, привести, или это военная тайна? Почему надо все время по 15 раз одно и то же повторять?
я ввожу 2 массива
массив А: 4 5 77 1
массив В: 76 45 3 2 6 7
вот что он мне выдаёт на выходе : 4 5 76 45 3 2 6 7 77 1
блиннннннннннннннннннн.сорри!!!! спасибо большое.с меня пиво!