排序1:深入了解数据结构第四弹——排序(1)——插入排序和希尔排序-CSDN博客
排序2:深入理解数据结构第五弹——排序(2)——快速排序-CSDN博客
前言:
目录
一、归并排序的思想
归并排序的基本思想如下:
归并排序的操作如下:
二、归并排序的递归实现
递归的实现其实是很有意思的,在上面我们已经讲了递归的思想,其实就是不断的重复划分然后排序的过程,所以我们就可以设计一个递归来实现这种,同时,由于每一步都要进行分区划分,所以我们可以封装一个划分函数(_MergeSort函数)在前,重复这个过程
void MergeSort(int* a, int n)
{
int* tmp = (int*)malloc(sizeof(int) * n);
_MergeSort(a, 0, n - 1,tmp);
free(tmp);
}
//归并排序
void _MergeSort(int* a, int begin,int end,int* tmp)
{
if (begin == end)
return;
//小区间优化
if (end - begin + 1 < 10)
{
InsertSort(a + begin, begin - end + 1);
}
int mid = (begin + end) / 2;
_MergeSort(a, begin, mid, tmp);
_MergeSort(a, mid + 1, end, tmp);
int begin1 = begin, end1 = mid;
int begin2 = mid + 1, end2 = end;
int i = begin;
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] < a[begin2])
{
tmp[i++] = a[begin1];
begin1++;
}
else
tmp[i++] = a[begin2++];
}
while (begin1 <= end1)
{
tmp[i++] = a[begin1++];
}
while (begin2 <= end2)
{
tmp[i++] = a[begin2++];
}
memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}