归并排序是将两个有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。如图所示
比较2个数列的第一个数,谁小就先取谁,然后接着进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
#include <stdio.h>
void MergeArray(int arr[], int first, int mid, int last, int temp[])//将两个有序数组合并
{
int i = first, j = mid+1;
int n = mid, m = last;
int k = 0;
while(i <= n && j <= m)
{
if(arr[i] <= arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while(i <= n)
temp[k++] = arr[i++];
while(j <= m)
temp[k++] = arr[j++];
for(i = 0; i < k; i++)
{
arr[first+i] = temp[i];
}
}
void MergeInsert(int arr[], int first, int last, int temp[])//递归分解数组
{
if(first < last)
{
int mid = (first+last)/2;
MergeInsert(arr, first, mid, temp);//左边有序
MergeInsert(arr, mid+1, last, temp);//右边有序
MergeArray(arr, first, mid, last, temp);//合并
}
}
void MergeSort(int arr[], int length)
{
int b[10];
MergeInsert(arr, 0, length-1, b);
}
void main()
{
int arr[] = {3,2,1,5,6,7,8,9,0,4};
int i = 0;
for(i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
MergeSort(arr, 10);
for(i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}