Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2011, 00:25   #1
pisarev-70
 
Регистрация: 08.05.2010
Сообщений: 2
По умолчанию Слияние массивов

Помогите мне решить задачку. Я уже все перепробовал. Ну ни как не получается.
Заданы три упорядоченных по возрастанию массива f[n], g[m], h[k].
Составить программу слияния этих массивов.
Благодарю всех, кто откликнулся.
pisarev-70 вне форума Ответить с цитированием
Старый 31.03.2011, 00:54   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

влом мне расписывать, алгоритм простейший. нахаляву могу предложить такой способ
Код:
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	vector<int> v, m;

	int f[] = { 1, 3, 4, 6 };
	int g[] = { 1, 4, 5, 7, 8 };
	int h[] = { 6, 8, 9, 10 };

	merge(f, f + sizeof(f) / sizeof(f[0]), g, g + sizeof(g) / sizeof(g[0]), back_inserter(v));
	merge(v.begin(), v.end(), h, h + sizeof(h) / sizeof(h[0]), back_inserter(m));
	copy(m.begin(), m.end(), ostream_iterator<int>(cout, " "));

	return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.03.2011, 12:16   #3
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

та тут простейшее решение на поверхности
Цитата:
три упорядоченных по возрастанию массива f[n], g[m], h[k].
указаны их размеры, значит они константны
следовательно завести новый массив
res[n + m + k] и и скопировать туда элементы предыдущих массивов
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 31.03.2011, 12:25   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
и скопировать туда элементы предыдущих массивов
видимо, надо бы сначала узнать, как именно они должны сливаться...
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 31.03.2011, 12:46   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2RUSt88
Цитата:
и скопировать туда элементы предыдущих массивов
ну копировать то не втупую, а классическим алгоритмом слияния, только для 3-х векторов. мне его реализовывать было влом, поэтому заюзал стандартный stl-ный мердж

2Mandrivnyk
Цитата:
видимо, надо бы сначала узнать, как именно они должны сливаться...
он же написал, слиянием
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.03.2011, 13:20   #6
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

2pproger
Цитата:
он же написал, слиянием
блин, опять конфликт терминологии -)
Мне почему-то сразу представилось, что, например, исходящий массив тоже должен быть отсортирован по возрастанию, причем именно в процессе слияния, а не потом.
или, еще интереснее, три массива должны быть "втасованы" друг в друга -- сначала в результирующий массив записываются первые элементы, причем тоже отсортированные по возрастанию относительно друг друга, потом вторые и так далее.
Иначе зачем бы была в постановке задачи информации о том, что исходные массивы отсортированы?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 31.03.2011, 13:23   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Mandrivnyk
нет тут никаких конфликтов терминологии. слияние это слияние, в любой книге по алгоритмам написано.
то, что чел указал, что массивы отсортированы просто означает, что они уже готовы к слиянию, не нужно их предварительно сортировать

естественно после слияния результирующий массив должен получиться отсортированным, в этом и смысл слияния отсортированных последовательностей
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.03.2011, 13:43   #8
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
естественно после слияния результирующий массив должен получиться отсортированным, в этом и смысл слияния отсортированных последовательностей
согласен
+
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 31.03.2011, 14:24   #9
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Есть идея как сделать. Минут через 20 скину наверно.


Цитата:
#include "stdio.h"

int main(){
const int m=4,n=6,k=5;
int f[m] = { 1, 4, 7,10 };
int g[n] = { 2, 5, 8, 11, 13,14 };
int h[k] = { 3, 6, 9, 12, 15 };
int fgh[m+n+k];
int x=0,y=0,z=0,i=0;
while(i<m+n+k){
if(x<m && y<n && z<k){
if(f[x]<=g[y] && f[x]<=h[z])
fgh[i]=f[x++];
else if(g[y]<=f[x] && g[y]<=h[z])
fgh[i]=g[y++];
else if(z<k)
fgh[i]=h[z++];}
else if(x<m && y<n && z>=k){
if(f[x]<=g[y])
fgh[i]=f[x++];
else
fgh[i]=g[y++];}
else if(x<m && y>=n && z<k){
if(f[x]<=h[z])
fgh[i]=f[x++];
else
fgh[i]=h[z++];}

else if(x>=m && y<n && z<k){
if(g[y]<=h[z])
fgh[i]=g[y++];
else
fgh[i]=h[z++];}
else if(x<m && y+z-n-k<=0)
fgh[i]=f[x++];
else if(y<n && x+z-m-k<=0)
fgh[i]=g[y++];
else
fgh[i]=h[z++];
printf("%d ", fgh[i++]);
}
}
Ёж птица гордая, пока не пнешь не полетит.

Последний раз редактировалось Ezhuk; 31.03.2011 в 15:01.
Ezhuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слияние двух массивов Anubys Общие вопросы C/C++ 5 28.03.2011 10:07
Слияние двух массивов Anubys Помощь студентам 0 26.03.2011 16:12
Ошибка в алгоритме слияние массивов ATAMAN200 Общие вопросы C/C++ 3 25.10.2010 20:37
Слияние массивов в паскале A_Orlov Помощь студентам 0 20.06.2010 21:09
Объединение, пересечение, слияние массивов -=Domestos=- Помощь студентам 6 25.12.2006 21:06