template<class T>
class MergeSort
{
public:
enum Type {
On,O1
//归并排序的辅助空间复杂度
};
void Sort(T *list, int size, Type t = On) {
if (t == On)MergeOn(list, 0, size);
else MergeO1(list, 0, size);
}
private:
void MergeSortOn(T *list, int l,int m, int r) {//[l,m),[m,r)
T *a = new T [r - l + 1];
int index = 0,mid = m,s=l;
while (l < mid && m < r) {
if (list[l] < list[m])a[index++] = list[l++];
else a[index++] = list[m++];
}
while (l < mid)a[index++] = list[l++];
while (m < r)a[index++] = list[m++];
for (int i = s, j = 0; i < r; i++, j++)list[i] = a[j];
delete []a;
}
void MergeOn(T *list,int l,int r){//[l,r)
if (l + 1 >= r)return;
int m = (l + r) / 2;
MergeOn(list, l, m);
MergeOn(list, m, r);
MergeSortOn(list, l, m, r);
}
void swap(T& a, T& b) {
T c = a;
a = b;
b = c;
}
void reverse(T *list, int l, int r) {//[l,r)
r--;
while (l < r)swap(list[l++], list[r--]);
}
void hand(T *list, int l, int m, int r) {//手摇算法
reverse(list, l, m);
reverse(list, m, r);
reverse(list, l, r);
}
void MergeSortO1(T *list, int l, int m, int r) {
while (l < m && m < r) {
while (l < m && list[l] <= list[m]) l++;
int move = 0;
while (m < r && list[l] > list[m])move++, m++;
hand(list, l, m - move, m);
l += move;
}
}
void MergeO1(T *list, int l,int r) {//[l,r)
if (l + 1 >= r)return;
int m = (l + r) / 2;
MergeO1(list, l, m);
MergeO1(list, m, r);
MergeSortO1(list, l, m, r);
}
};