归并排序是利用归并的思想将一组数据进行排序。它是一种外部排序(可以对那些在磁盘上的大数据进行排序)。下边进行图解。
【代码实现】
//归并排序
void Merge(int* a,int begin,int mid,int end,int tmp[])
{
int begin1 = begin;
int end1 = mid;
int begin2 = mid+1;
int end2 = end;
int index = 0;
int i = 0;
while(begin1 <= end1 && begin2 <= end2)
{
if(a[begin1] < a[begin2])
{
tmp[index++] = a[begin1++];
}
if(a[begin2] < a[begin1])
{
tmp[index++] = a[begin2++];
}
}
//应该有一个区间没有拷贝完成
while(begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while(begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
//将tmp数组的内容拷贝到a数组
while(i < index)
{
a[begin + i] = tmp[i];
++i;
}
}
void MergeSort(int* a,int begin,int end,int tmp[])
{
assert(a && size > 0);
if(begin < end)
{
int mid = begin + (end - begin)/2;
MergeSort(a,begin,mid,tmp);
MergeSort(a,mid + 1,end,tmp);
Merge(a, begin, mid, end, tmp);
}
}
时间复杂度:O(N*logN).递归的次数就是logN次,每次遍历N次。
空间复杂度:O(N + logN)。递归深度是logN,辅助的大小为N的tmp数组。关于对磁盘上的数据的排序,前边的文章已经分享过~~可以自行查看。