Search code examples
c++memoryvectormergesort

C++ : Error in Mergesort using Vector (memory managment)


I am trying to implement merge sort routine in C++ using vectors. But I am getting random numbers after sorting. It doesn't giving any kind of warning either. Please help. Here is my complete code. I am trying to implement it in a class.

#include <iostream>
#include <vector>
#include <limits> 
using namespace std;

class array{
 private:
  vector<int> num;
 public:
  array();
  void print();
  void remove(int element);
  void insert(int element);
  void sort();
  void mergesort(int start, int end);
  void merge(int start, int end);
};

array :: array(){
  cout << "Enter elements to insert in array(any character to end): ";
  int element;
  while(cin >> element)
    num.push_back(element);
  // clearing the input(cin) buffer
  cin.clear();
  cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
}

void array :: print(){
  for(unsigned int i = 0; i < num.size(); i++)
    cout << "Element " << i+1 << ": " << num[i] << endl;
}

void array :: remove(int element){
  for(unsigned int i = 0; i< num.size(); i++)
    if(num[i] == element){
      num.erase(num.begin()+i,num.begin()+i+1);
      break;
    }
}

void array :: insert(int element){
  num.push_back(element);
}

void array :: sort(){
  if(num.size() <= 1)
    return;
  else
    mergesort(0, num.size()-1);
}

void array :: mergesort(int start, int end){
  if(start >= end)
    return;
  else{
    int mid = (start + end)/2;
    mergesort(start, mid);
    mergesort(mid+1, end);
    merge(start, end);
  }
}

void array :: merge(int start, int end){
  vector<int> num2;
  int mid = (start + end)/2;
  int i = start;
  int j = mid + 1;
  cout << "start: " << start << "   mid: " << mid << "   end: " << end << endl;

  while(i <= mid && j <= end)
    num2.push_back(num[i] >= num[j] ? num[j++]: num[i++]);

  if(i > mid)
    while(j <= end)
      num2.push_back(num[j++]);
  else
    while(i <= mid)
      num2.push_back(num[i++]);

  for(unsigned int i = 0; i <= num.size(); i++)
    num[i] = num2[i];
}

Solution

  • The most obvious issue is the last loop in merge()

    for(unsigned int i = 0; i <= num.size(); i++)
        num[i] = num2[i];
    

    Indexes start and end are passed to the function but this code blindly tries to copy num.size()+1 elements from your temporary vector to the beginning of num. I think something like this is more correct:

    for(unsigned int i = 0; i < num2.size(); i++)
        num[start + i] = num2[i];