递归版
template <class T>
void merge(T *a, T *b, int left, int mid, int right)
{
int i = left, j = mid + 1, k = left;
while (i <= mid && j <= right)
{
if (a[i] > a[j])
b[k++] = a[j++];
else
b[k++] = a[i++];
}
if (i > mid)
while (j <= right)
b[k++] = a[j++];
else
while (i <= mid)
b[k++] = a[i++];
while (left <= right)
a[left] = b[left++];
}
template <class T>
void mergeSort(T *a, T *b, int left, int right)
{
if (left < right)
{
int mid = (left + right) / 2;
mergeSort(a, b, left, mid);
mergeSort(a, b, mid + 1, right);
merge(a, b, left, mid, right);
}
}
非递归版,a与b相互归并省去b向a赋值部分
template <class T>
void merge(T *a, T *b, int left, int mid, int right)
{
int i = left, j = mid + 1, k = left;
while (i <= mid && j <= right)
{
if (a[i] > a[j])
b[k++] = a[j++];
else
b[k++] = a[i++];
}
if (i > mid)
while (j <= right)
b[k++] = a[j++];
else
while (i <= mid)
b[k++] = a[i++];
//while (left <= right)
// a[left] = b[left++];
}
template<class T>
void mergePass(T *a, T *b, int n, int segmentSize)
{
int i = 0;
while (i <= n - 2 * segmentSize)
{
merge(a, b, i, i + segmentSize - 1, i + 2 * segmentSize - 1);
i = i + 2 * segmentSize;
}
if (i + segmentSize < n)
merge(a, b, i, i + segmentSize - 1, n - 1);
else
for (int j = i; j < n; j++)
b[j] = a[j];
}
template<class T>
void mergeSort(T *a, int n)
{
T *b = new T[n];
int segmentSize = 1;
while (segmentSize < n)
{
mergePass(a, b, n, segmentSize);
segmentSize *= 2;
mergePass(b, a, n, segmentSize);
segmentSize *= 2;
}
delete[] b;
}