首先,我们要理解归并排序的基本逻辑。何为归并排序?归并排序有点类似快排,就是将数组一直二分,但与快排不同的是,快排每次会分出一个中心轴的位置,然后通过中心轴分出来的两组数组继续快排,当分的只剩下一个元素或区间不存在时停止快排。而归并排序不会把中心轴给拿出来,因为他在逐层递归的过程中并没有排序,而是直到只剩下一个元素或区间不存在时才开始逐层排序,往回走。
以下是实现代码:
#include<stdio.h>
#include<stdlib.h>
void Mergesort(int* a, int n);
void Merge_sort(int* a, int* temp, int begin, int end);
int main()
{
int a[10] = { 1,3,5,7,9,6,4,2,8 };
int n = 10;
for (int i = 0;i < n;i++)
{
printf("%d",a[i]);
}
printf("\n");
Mergesort(a,n);
for (int i = 0;i < n;i++)
{
printf("%d", a[i]);
}
return 0;
}
void Mergesort(int* a, int n)
{
int* temp = (int*)malloc(sizeof(int) * n);
if (temp == NULL)
{
perror("malloc fail");
return;
}
Merge_sort(a, temp, 0, n - 1);
free(temp);
temp = NULL;
}
void Merge_sort(int* a, int* temp, int begin, int end)
{
if (begin >= end)
return;
int mid = (begin + end) / 2;
Merge_sort(a, temp, begin, mid);
Merge_sort(a, temp, mid+1, end);
int begin1 = begin, end1 = mid;
int begin2 = mid + 1, end2 = end;
int i = begin;
while (begin1<=end1&&begin2<=end2)
{
if (a[begin1] < a[begin2])
temp[i++] = a[begin1++];
else
temp[i++] = a[begin2++];
}
while (begin1 <= end1)
{
temp[i++] = a[begin1++];
}
while (begin2 <= end2)
{
temp[i++] = a[begin2++];
}
memcpy(a+begin, temp+begin, (end-begin+1)*sizeof(int));
}