利用递归与分治技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列。
原理如下:对于给定的一组记录,首先将两个相邻的长度为1的子序列进行归并,得到n/2个长度为2或者1的有序子序列,在将其两两归并,反复执行此过程,直到得到一个有序的序列为止。
归并排序特点:
平均时间复杂度: O(nlog2n)
稳 定 性: 稳定
代码:
#include <stdio.h>
#include <stdlib.h>
void Merge(int a[], int start, int end, int middle)
{
int i, k, j, n1, n2;
n1 = middle - start + 1;
n2 = end - middle;
int *L = (int *)malloc(n1 * sizeof(int));
int *R = (int *)malloc(n2 * sizeof(int));
for(i = 0, k = start; i < n1; i++, k++)
{
L[i] = a[k];
}
for(i = 0, k = middle + 1; i < n2; i++, k++)
{
R[i] = a[k];
}
for (k = start, i = 0, j = 0; i < n1 && j < n2; k++)
{
if (L[i] < R[j])
{
a[k] = L[i];
i++;
}
else
{
a[k] = R[j];
j++;
}
}
if (i < n1)
{
for (j = i; j < n1; j++, k++)
{
a[k] = L[j];
}
}
if (j < n2)
{
for (i = j; i < n2; i++, k++)
{
a[k] = R[i];
}
}
}
void MergeSort(int a[], int start, int end)
{
int middle;
if(start < end)
{
middle = (start + end) / 2;
MergeSort(a, start, middle);
MergeSort(a, middle + 1, end);
Merge(a, start, end, middle);
}
}
int main()
{
int a[] = {1,34,6,3,2,64};
int length = sizeof(a)/sizeof(a[0]);
MergeSort(a, 0, length - 1);
for(int i = 0; i < length; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}