/*************************************************************************
> File Name: mergeSort.cpp
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年12月01日 星期一 21时32分03秒
************************************************************************/
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
template<typename Comparable>
void merge(vector<Comparable> &a,vector<Comparable> &tmpArray,
int leftPos,int rightPos,int rightEnd)
{
int leftEnd=rightPos-1;
int tmpPos=leftPos;
int numElements=rightEnd-leftPos+1;
while(leftPos<=leftEnd&&rightPos<=rightEnd)
if(a[leftPos]<=a[rightPos])
tmpArray[tmpPos++]=std::move(a[leftPos++]);
else
tmpArray[tmpPos++]=std::move(a[rightPos++]);
while(leftPos<=leftEnd) //copy rest of first half
tmpArray[tmpPos++]=std::move(a[leftPos++]);
while(rightPos<=rightEnd) //copy rest of right half
tmpArray[tmpPos++]=std::move(a[rightPos++]);
//copy tmpArray back
for(int i=0;i<numElements;++i,--rightEnd)
a[rightEnd]=std::move(tmpArray[rightEnd]);
}
/**
* Internal method that makes recursive calls
* a is an array of Comparable items
* tmpArray is an array to place the merged result.
* left is the left-most index of the subarray.
* right is the right-most index of the subarray.
*/
template<typename Comparable>
void mergeSort(vector<Comparable> &a,vector<Comparable> &tmpArray,
int left,int right)
{
if(left<right)
{
int center=(left+right)/2;
mergeSort(a,tmpArray,left,center);
mergeSort(a,tmpArray,center+1,right);
merge(a,tmpArray,left,center+1,right);
}
}
/**
* Mergesort algorithm(driver)
*/
template<typename Comparable>
void mergeSort(vector<Comparable> &a)
{
vector<Comparable> tmpArray(a.size());
mergeSort(a,tmpArray,0,a.size()-1);
}
int main()
{
vector<int> vec;
int val;
ifstream in;
in.open("NUMBER_FILE");
ofstream out;
out.open("sort_out");
while(in>>val)
vec.push_back(val);
clock_t start_time1=clock();
mergeSort(vec);
clock_t end_time1=clock();
cout<<"QUICK Running time is "<<
static_cast<double>(end_time1-start_time1)/CLOCKS_PER_SEC<<" S"<<endl;
cin.clear();
for(auto c:vec)
out<<c<<" ";
cout<<endl;
out.close();
in.close();
}
归并排序—数据结构与算法分析第四版
最新推荐文章于 2024-03-05 20:03:33 发布