//
// main.cpp
// Data Structure TRY1
//
// Created by zr9558 on 6/7/13.
// Copyright (c) 2013 zr9558. All rights reserved.
//
// Data Structure C++, Weiss, P.276 MergeSort
#include<iostream>
using namespace std;
#include<vector>
#include<math.h>
/*
a is an array oof Comparable items;
tempArray is an array to place the merged result;
leftPos is the left-most index of the subarray;
rightPos is the index of the start of the second half;
rightEnd is the right-most index of the subarray.
*/
template<typename Comparable>
void merge( vector<Comparable> &a, vector<Comparable> &tempArray, int leftPos, int rightPos, int rightEnd)
{
int leftEnd=rightPos-1;
int tempPos=leftPos;
int numElements=rightEnd-leftPos+1;
// Main loop
while( leftPos<=leftEnd && rightPos<=rightEnd)
{
if( a[leftPos]<=a[rightPos])
tempArray[tempPos++]=a[leftPos++];
else
tempArray[tempPos++]=a[rightPos++];
}
while( leftPos<=leftEnd) // Copy rest of first half
tempArray[tempPos++]=a[leftPos++];
while( rightPos<=rightEnd)
tempArray[tempPos++]=a[rightPos++];
// Copy tempArray back;
for( int i=0; i<numElements; ++i, rightEnd--)
a[rightEnd]=tempArray[rightEnd];
}
template<typename Comparable>
void mergeSort( vector<Comparable> &a, vector<Comparable> & tempArray, int left, int right)
{
if( left<right)
{
int center=(left+right)/2;
mergeSort(a,tempArray, left, center);
mergeSort(a,tempArray, center+1, right);
merge(a,tempArray, left, center+1, right);
}
}
template<typename Comparable>
void mergeSort( vector<Comparable> &a)
{
vector<Comparable> tempArray(a.size());
mergeSort(a,tempArray,0,int(a.size())-1);
}
int main()
{
vector<int> ivec;
for( int i=0; i<30; ++i)
ivec.push_back(rand()%100);
for( int i=0; i<ivec.size(); ++i)
cout<<ivec[i]<<" ";
cout<<endl;
mergeSort(ivec);
for( int i=0; i<ivec.size(); ++i)
cout<<ivec[i]<<" ";
cout<<endl;
return 0;
}