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:
#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();
}