归并排序就是利用递归和分治技术将数据序列划分为越来越小的半子表,再对半子表进行排序,最后再用
递归将排好序的半子表合并成越来越大的有序序列。
归并排序是一种稳定的排序,其时间复杂度:都是O(nlog2n) 空间复杂度 O(1)
归并排序代码如下:
#include <stdio.h>
#include <stdlib.h>
void Merging2(int array[], int begin, int mid, int end)
{
int *tmp = (int *)malloc(sizeof(int)*(end-begin+1));
int i = begin;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end)
{
if (array[i] < array[j]) //把较小的值放入数组左端
tmp[k++] = array[i++];
else
tmp[k++] = array[j++];
}
while (i <= mid)
tmp[k++] = array[i++]; //把左端剩余的放入数组
while (j <= end)
tmp[k++] = array[j++]; //把右端剩余的放入数组
for (i = 0; i < k; i++)
{
array[begin+i] = tmp[i]; //把临时数组拷贝到原始数组
}
free(tmp);
}
void MergeSort2(int a[], int begin, int end)
{
int mid;
if (a == NULL || begin >= end)
{
return;
}
mid = (begin + end) / 2; //计算分裂点
MergeSort2(a, begin, mid); //对子区间递归并做归并排序
MergeSort2(a, mid+1, end); //对子区间递归并做归并排序
Merging2(a, begin, mid, end); //组合把两个有序区合并成一个有序区
}
int main()
{
int i;
int a[] = {65, 87, 23, 11, 34, 25, 69, 9, 10, 8};
int len = sizeof(a) / sizeof(a[0]);
MergeSort2(a, 0, len-1);
for (i = 0; i < len; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}