Dwa posortowane wektory

0

Witam mam zadane dwa posortowane rosnaco wektory i mam napisac funkcje, ktora polaczy te dwa wektory do nowego wektora.
I wpadlem na taki pomysl:

vector<int>dwawekty(vector<int>pierwszy, vector<int>drugi)
{
	vector<int>trzeci;
	int i = 0;
	int j = 0;
	for (int k = 0; k < pierwszy.size() + drugi.size(); ++k)
	{
		if(pierwszy[i]<drugi[j])
		{
			trzeci.push_back(pierwszy[i]);
			i = i + 1;
			continue;
		}
		else if (drugi[j] < pierwszy[i])
		{
			trzeci.push_back(drugi[j]);
			j = j + 1;
		
		}
	}
	return trzeci;
}
int main()
{
	vector<int>pierwszy = { 2,4,6,8,15,17,20 };
	vector<int>drugi = { 3,5,8,9,22,50 };
	vector<int>trzeci = dwawekty(pierwszy, drugi);
	for (int i = 0; i < trzeci.size(); ++i)
	   {
		cout << trzeci[i] << "\t";
	   }
}

Kilka pierwszych liczb sie wypisuje poprawnie, a potem juz nic.

3

nie męcz się i skorzystaj z std::merge() :)

vector<int>pierwszy = { 2,4,6,8,15,17,20 };
vector<int>drugi = { 3,5,8,9,22,50 };
vector<int>trzeci;
merge(pierwszy.begin(), pierwszy.end(), drugi.begin(), drugi.end(), back_inserter(trzeci));

copy(trzeci.begin(), trzeci.end(), ostream_iterator<int>(cout, " ")); //wypisanie
1

Słyszałeś o procedurze merge? Jest częścią merge sort.

0

Oki dzieki za pomoc, waszym sposobem mi wyszlo, ale strasznie mnie ciekawi czemu pare wynikow jest poprawnych i nie widze bledu myslowego.

2

1.) Nie obsługujesz przypadku gdy pierwszy[i] == drugi[j], masz tylko większa/mniejsza
2.) Nie sprawdzasz czy i i j nie wychodzą poza zakres, bo przecież jedną z tablic można szybciej "przerobić" od drugiej i wtedy porównujesz wartość z jednej tablicy do czegoś niezidentyfikowanego już spoza drugiej tablicy. Program nie sypie się tylko dlatego, że vector zapewne zaalokował więcej pamięci niż potrzebujesz.

1

Jeżeli już chcesz "ręcznie" (wyważać otwarte drzwi) to:

vector<int> dwawekty(const vector<int> &va,const vector<int> &vb)
{
    vector<int> vc(va.size()+vb.size());
    size_t a=0,b=0,c=0;
    while((a<va.size())&&(b<vb.size())) vc[c++]=va[a]<vb[b]?va[a++]:vb[b++];
    while(a<va.size()) vc[c++]=va[a++];
    while(b<vb.size()) vc[c++]=vb[b++];
    return vc;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1