归并排序

Posted yinhao-ing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序相关的知识,希望对你有一定的参考价值。

本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/94588321

归并排序的基本操作是将两个有序数组合并成一个有序数组,原理是运用分治思想,递归地将一个数组的左右两部分有序数列进行归并。

C语言实现:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define elementType int
 4 
 5 void mergeSort(elementType A[], int N);//N为数组大小,统一函数接口
 6 void mSort(elementType A[], elementType tmpA[], int L, int rightEnd);//传入左右边界
 7 void merge(elementType A[], elementType tmpA[], int L, int R, int rightEnd);//将有序的两个部分进行归并
 8 
 9 
10 int main()
11 
12     int N;
13     scanf("%d", &N);
14     elementType* A = (elementType*)malloc(N * sizeof(elementType));
15     for (int i = 0; i < N; i++)
16         scanf("%d", &A[i]);
17     mergeSort(A, N);
18     for (int i = 0; i < N; i++)
19         printf("%d ", A[i]);
20     return 0;
21 
22 
23 void mergeSort(elementType A[], int N) 
24     elementType* tmpA = (elementType*)malloc(N * sizeof(elementType));//申请内存建立临时数组
25     if (tmpA != NULL) 
26         mSort(A, tmpA, 0, N - 1);
27         free(tmpA);
28     
29     else
30         printf("Error!\n");//内存申请失败
31 
32 
33 void mSort(elementType A[], elementType tmpA[], int L, int rightEnd) 
34     if (L < rightEnd) 
35         int center = (L + rightEnd) / 2;
36         mSort(A, tmpA, L, center);
37         mSort(A, tmpA, center + 1, rightEnd);
38         merge(A, tmpA, L, center + 1, rightEnd);
39     
40 
41 
42 void merge(elementType A[], elementType tmpA[], int L, int R, int rightEnd) 
43     int tmpL = L,
44         leftEnd = R - 1,
45         elementNum = rightEnd - L + 1;
46     while (L <= leftEnd && R <= rightEnd) 
47         if (A[L] < A[R])
48             tmpA[tmpL++] = A[L++];
49         else 
50             tmpA[tmpL++] = A[R++];
51     
52     while (L <= leftEnd)
53         tmpA[tmpL++] = A[L++];
54     while (R <= rightEnd)
55         tmpA[tmpL++] = A[R++];
56     for (int i = 0; i < elementNum; i++, rightEnd--)
57         A[rightEnd] = tmpA[rightEnd];
58 

 

以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章

常见排序算法之归并排序——归并排序

归并排序

归并排序(递归非递归以及自然归并排序)算法总结

排序算法——归并排序

归并排序(逆序数问题)详解

归并排序及其应用场景