参考资料
自己改编简化版本
本篇回顾简化过程,根据理解自己手敲,然后发现merge()参数其实可以不用n,即继续简化了原来版本。加入了模板编程,使程序可以适用于其他数据类型。
#include<iostream>
using namespace std;
template<typename T>
void myMergeTwoList(T a[], int left, int right);
template<typename T>
void myMergeSort(T a[], int n, int left, int right)
{
if (left + 1 < right)
{
int mid = (left + right) / 2;
myMergeSort(a, n, left, mid);
myMergeSort(a, n, mid, right);
myMergeTwoList<T>(a, left, right);
}
}
template<typename T>
void myMergeTwoList(T a[], int left, int right)
{
int mid = (left + right) / 2;
int n1 = mid - left, n2 = right - mid;
T* L = new T[n1];
T* R = new T[n2];
for (int i = 0; i < n1; i++)
L[i] = a[left + i];
for (int j = 0; j < n2; j++)
R[j] = a[mid + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
a[k++] = L[i++];
else
a[k++] = R[j++];
}
while(i<n1)
a[k++] = L[i++];
while(j<n2)
a[k++] = R[j++];
delete[] L;
delete[] R;
L = R = NULL;
}
int main()
{
const int n = 5;
int a[n] = { 3,-5,-6,5,6 };
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
myMergeSort(a, n, 0, n);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
int型验证结果:
float型验证及结果:
int main()
{
const int n = 5;
float a[n] = { 3.2,-5.35,2.65,1.89,0.67 };
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
myMergeSort(a, n,0,5);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
system("pause");
return 0;
}