Click here to Skip to main content
15,886,798 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,
Somehow I implemented Merge sort using vectors, the problem is:
It works correctly with less than 9 inputs, but with 9 or more inputs it does something which I don't understand, such as below:
Input:
5-4-3-2-1   ---   6-5-4-3-2-1   ---   9-8-7-6-5-4-3-2-1
Output:
1-2-3-4-5   ---   1-2-3-4-5-6   ---   1-2-3-4-5-7-6-8-9

Here is the code:

C++
#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;
void showvector(vector<int> numbers){
	for (vector<int>::iterator i = numbers.begin(); i != numbers.end(); i++)
	{
		cout << *i;
		if (i != numbers.end() - 1)cout << " - ";
	}
}

vector<int> getvector(){
	vector<int> numbers(0);
	cout << "please enter you numbers :::\n''entering any characters but numbers is the end of entry''\n";
	int counter = 0;
	do{
		int newnumber = 0;
		cout << "element(" << counter << ") = ";
		counter++;		
		cin >> newnumber; getchar();
		if (cin.good())
			numbers.push_back(newnumber);
		if (cin.fail()){
			cout << "numbers are :";
			showvector(numbers);
		}
	} while (cin.good()); getchar();
	return numbers;
}

void mergesort(vector<int>& numbers);

vector<int> merge(vector<int>& one, vector<int>& two){
	cout << "\ncomparing vector one with "; showvector(one); cout << " element(s) with vector two with "; showvector(two); cout << " element(s)\n";
	vector<int>::iterator j = two.begin();
	vector<int>::iterator i;
	for (i = one.begin(); i != one.end(); i++){
		cout << "comparing " << *i << " with " << *j<<endl;
		if (*i > *j){
			cout << "exchanging " << *i << " with " << *j << endl;;
			int c = *i;
			*i = *j;
			*j = c;
			j++;
		}
	}
	if (j != two.end() && i==one.end())
		mergesort(two);	
	cout << "\npushing vector two with "; showvector(two); cout << " element(s) back to vector one with "; showvector(one); cout << " element(s)\n";	
	for (j=two.begin(); j != two.end();j++)
			one.push_back(*j);
	cout << "returning sorted vector as\n";
	showvector(one);
	return one;
}

void mergesort(vector<int>& numbers){
	if (numbers.size() > 1){		
		vector<int> halfone(numbers.begin(), numbers.begin() + numbers.size() / 2);
		mergesort(halfone);
		vector<int> halftwo(numbers.begin() + numbers.size() / 2, numbers.end());		
		mergesort(halftwo);
		numbers = merge(halfone, halftwo);
	}				
}

int main(){
	vector<int> numbers(getvector());	
	mergesort(numbers);
	cout << "\nnumbers are :";
	showvector(numbers);
	getchar();
}
Posted

1 solution

You can't implement merge sort "in place". If you swap or overwrite some of the elements, it isn't a merge sort anymore. In this case, moving an element from one sequence to other potentially breaks the other sequence (eg. it is no longer ordered).

C++
static std::vector<int> merge(const std::vector<int>& one, const std::vector<int>& two)
{
	std::vector<int>::const_iterator i = one.begin();
	std::vector<int>::const_iterator j = two.begin();
	std::vector<int> result;
	while (i != one.end() && j != two.end())
	{
		if (*i < *j)
			result.push_back(*i++);
		else
			result.push_back(*j++);
	}
	while (i != one.end())
		result.push_back(*i++);
	while (j != two.end())
		result.push_back(*j++);

	return result;
}


Please consider making the parameter to showvector a const reference.
 
Share this answer
 
v3

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900