二路归并排序的C++实现
#include<iostream>
#include<vector>
using namespace std;
typedef int elem;
void mergeArray(vector<elem>&, int, int, int, int (*)(elem, elem));
void mergeSort(vector<elem>&, int, int, int (*)(elem, elem));
int comp(elem, elem);
int main(void){
elem a[]{4, 6, 5, 1, 7, 2};
vector<elem> v(a, a+6);
mergeSort(v, 0, 5, comp);
for (vector<elem>::iterator it=v.begin(); it!=v.end(); ++it)
cout<<*it<<" ";
return 0;
}
int comp(elem a, elem b){
return a-b;
}
void mergeArray(vector<elem>& v, int start, int mid, int end, int (*cmp)(elem, elem)){
if(start >= end)
return;
int i=start, j=mid+1;
vector<elem> temp;
while (i<=mid && j<=end){
if(cmp(v[i], v[j]) <= 0){
temp.push_back(v[i++]);
}
else{
temp.push_back(v[j++]);
}
}
while (i<=mid){
temp.push_back(v[i++]);
}
while (j<=end){
temp.push_back(v[j++]);
}
for (int i=start; i<=end;++i)
v[i] = temp[i-start];
}
void mergeSort(vector<elem>& v, int start, int end, int (*cmp)(elem, elem)){
if(start >= end)
return;
int mid = (start + end) / 2;
mergeSort(v, start, mid, cmp);
mergeSort(v, mid+1, end, cmp);
mergeArray(v, start, mid, end, cmp);
}