归并排序
(这里参考自 狄泰 数据结构课程)
- 基本思想
将两个或两个以上的有序序列合并成一个有序序列 意思就是
V[ 0 ] , V[ 1 ] , V[ 02] ,…V[ m ] 和 V[ m ] , V[ m+1 ] , V[ m+2] ,…V[ n-1 ]
合并 为 V[ 0 ] , V[ 1 ] , V[ 02]…V[ n-1 ]
看下图 举例:
- 直接上代码:
template <typename T>
void Sort::Merge(T array[], int len, bool min2max) //对外使用接口
{
T* helper = new T[len]; //使用辅助数组
if(helper != NULL)
Merge(array, helper, 0, len-1, min2max);
delete helper;
}
template <typename T>
void Sort::Merge(T src[], T helper[], int begin, int end, bool min2max)
{
if(begin == end) //这里是递归出口当下标相等说明已经到最底层
{
return;
}
else
{
int mid = (begin + end)/2; //将数组分成两部分
Merge(src, helper, begin, mid, min2max); //左边数组
Merge(src, helper, mid+1, end, min2max); //右边数组
Merge(src, helper, begin, mid, end, min2max); //两边数组合并
}
}
template <typename T>
void Sort::Merge(T src[], T helper[], int begin, int mid, int end, bool min2max)
{
int i = begin, j = mid+1, k = begin;
while((i <= mid) && (j <= end))
{
if(min2max ? (src[i] < src[j]) : (src[i] > src[j]))
helper[k++] = src[i++]; //将符合条件的元素放进辅助数组中
else
helper[k++] = src[j++];
}
while(i <= mid) //当一边数组的元素个数多于另一边,将剩余的元素放入辅助数组
helper[k++] = src[i++];
while(j <= end)
helper[k++] = src[j++];
/*
* 将排好序的数组拷贝回 src 是因为返回上一层递归后再利用 src 合并
*/
for(i = begin; i <= end; i++)
{
src[i] = helper[i];
}
}