先來看看普通int 類型的的實現
void merge(int*src, int *des, int low, int mid, int high) //歸併
{
int i = low;
int j = mid + 1;
int k = low;
while ((i <= mid) && (j <= high)) //將小的放到目的數組中
{
if (src[i] < src[j]) //那個臨時數組
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
}
while (i <= mid) //若還剩幾個尾部元素
{
des[k++] = src[i++];
}
while (j <= high) //若還剩幾個尾部元素
{
des[k++] = src[j++];
}
}
//每次分爲兩路 當只剩下一個元素時,就不需要在劃分
void devide(int *src, int* des, int low, int high, int max) //劃分
{
if (low == high) //只剩一個元素時,直接賦值給des
{
des[low] = src[low];
}
else
{
int mid = (low + high) / 2;
int* tmp = (int*)malloc(sizeof(int)*max);
//遞歸進行兩路,兩路的劃分
//當剩下一個元素的時,遞歸劃分結束,然後開始merge歸併操作
if (tmp != NULL)
{
devide(src, tmp, low, mid, max);
devide(src, tmp, mid + 1, high, max);
merge(tmp, des, low, mid, high); //調用歸併函數進行歸併
}
free(tmp);
}
}
void mergesort(int* src, int len)
{
devide(src, src, 0, len - 1, len);
}
然後在這個基礎上 改進改進
就成了下面的樣子
template <typename T>
void merge(T* src, T * des, int low, int mid, int high) //歸併
{
int i = low;
int j = mid + 1;
int k = low;
while ((i <= mid) && (j <= high)) //將小的放到目的數組中
{
if (src[i] < src[j]) //那個臨時數組
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
}
while (i <= mid) //若還剩幾個尾部元素
{
des[k++] = src[i++];
}
while (j <= high) //若還剩幾個尾部元素
{
des[k++] = src[j++];
}
}
//每次分爲兩路 當只剩下一個元素時,就不需要在劃分
template <typename T>
void devide(T *src, T* des, int low, int high, int max) //劃分
{
if (low == high) //只剩一個元素時,直接賦值給des
{
des[low] = src[low];
}
else
{
int mid = (low + high) / 2;
T* tmp = (T*)malloc(sizeof(T)*max); //需要注意的就是這裏 使用malloc也是這個原因
//遞歸進行兩路,兩路的劃分
//當剩下一個元素的時,遞歸劃分結束,然後開始merge歸併操作
if (tmp != NULL)
{
devide(src, tmp, low, mid, max);
devide(src, tmp, mid + 1, high, max);
merge(tmp, des, low, mid, high); //調用歸併函數進行歸併
}
free(tmp);
}
}
template <typename T>
void mergesort(T* src, int len)
{
devide(src, src, 0, len - 1, len);
}
template <typename T>
void printArray(T *src, int len)
{
for (int i = 0; i < len; i++)
{
cout << src[i] << " ";
}
cout << endl;
}
當然這個也挺簡單的,只需要聲明一下函數模版,然後把參數類型改成T, 但是這個對於對象的比較,還有多字符串的排序是無能爲力的,仍需改進,留坑