1.归并排序的定义
归并排序就是利用分而治之的思想将一个大数组分成若干个小数组,直到每个数组的大小元素为一,再不断有序合并成一个大数组。
2.代码实现
#include<stdio.h>
using namespace std;
/* 归并排序 - 递归实现 */
/* L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置*/
void Merge(int A[], int TmpA[], int L, int R, int RightEnd)
{ /* 将有序的A[L]~A[R-1]和A[R]~A[RightEnd]归并成一个有序序列 */
int LeftEnd, NumElements, Tmp;
int i;
LeftEnd = R - 1; /* 左边终点位置 */
Tmp = L; /* 有序序列的起始位置 */
NumElements = RightEnd - L + 1;
while (L <= LeftEnd && R <= RightEnd) {
if (A[L] <= A[R])
TmpA[Tmp++] = A[L++]; /* 将左边元素复制到TmpA */
else
TmpA[Tmp++] = A[R++]; /* 将右边元素复制到TmpA */
}
while (L <= LeftEnd)
TmpA[Tmp++] = A[L++]; /* 直接复制左边剩下的 */
while (R <= RightEnd)
TmpA[Tmp++] = A[R++]; /* 直接复制右边剩下的 */
for (i = 0; i < NumElements; i++, RightEnd--)
A[RightEnd] = TmpA[RightEnd]; /* 将有序的TmpA[]复制回A[] */
}
void Msort(int A[], int TmpA[], int L, int RightEnd)
{ /* 核心递归排序函数 */
int Center;
if (L < RightEnd) {
Center = (L + RightEnd) / 2;
Msort(A, TmpA, L, Center); /* 递归解决左边 */
Msort(A, TmpA, Center + 1, RightEnd); /* 递归解决右边 */
Merge(A, TmpA, L, Center + 1, RightEnd); /* 合并两段有序序列 */
}
}
void MergeSort(int A[], int N)
{ /* 归并排序 */
int* TmpA;
TmpA = (int*)malloc(N * sizeof(int));
if (TmpA != NULL) {
Msort(A, TmpA, 0, N - 1);
free(TmpA);
}
else printf("空间不足");
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int len = sizeof(arr)/sizeof(arr[10]);
MergeSort(arr, len);
for (int i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
return 0;
}
3.时间复杂度
归并排序的时间复杂度是O(NlogN);
是稳定的排序方法