“归并”一词在中文含义中就是合并的意思,而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表,就叫归并。
这个算法的思路基于如下事实:假设我已经有两个有序的数组,我肯定是可以把它们插在一起,变成一个有序的大数组的。
所以这个算法分为两步:
1.“归”。将一个大数组不停的分解,直到剩下2个元素,然后我会对它们排序。
2.“并”。将两个排好序的2个元素的数组(或者是一个2个元素,一个1个元素)合并成一个有序的大数组。依次类推。
时间复杂度:O(nlogn) 稳定
归并排序(递归实现)
归并排序(Merge Sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到⌈n/2⌉个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。
//归并排序(递归操作)
#include "stdafx.h"
#include<stdio.h>
#define MAXSIZE 10
//实现归并,把最后的结果存放在list1中
void merging(int *list1, int list1_size, int *list2, int list2_size)
{
int i, j, k;
int temp[MAXSIZE];//临时数组
i = j = k = 0;
while (i<list1_size&&j<list2_size)
{
if (list1[i]<list2[j])
{
temp[k++] = list1[i++];
}
else
{
temp[k++] = list2[j++];
}
}
while (i<list1_size)
{
temp[k++] = list1[i++];
}
while (j<list2_size)
{
temp[k++] = list2[j++];
}
for (int m = 0; m < (list1_size + list2_size); m++)
{
list1[m] = temp[m];
}
}
void MergeSort(int k[], int n)
{
if (n > 1)
{
int *list1 = k;
int list1_size = n / 2;
int *list2 = k + n / 2;
int list2_size = n - list1_size;
MergeSort(list1, list1_size);
MergeSort(list2, list2_size);
merging(list1, list1_size, list2, list2_size);
}
}
int main()
{
int i, a[10] = { 5, 2, 6, 0, 3, 9, 1, 7, 4, 8 };
MergeSort(a, 10);
printf("排序后的结果是:");
for (i = 0; i<10; i++)
{
printf("%d", a[i]);
}
printf("\n");
return 0;
}