排序算法05:归并排序

来源:互联网 发布:腾讯内部员工网络 编辑:程序博客网 时间:2024/05/29 14:32

归并排序(MergeSort),本质是“分治算法”,包括“分”MergeSort和“合”Merge两个过程。

#include "MergeSort.h"void Merge(int A[], int Start, int Mid, int End){int n1 = Mid - Start + 1;int n2 = End - Mid;int *Left = (int*)malloc(n1 * sizeof(int));int *Right = (int*)malloc(n2 * sizeof(int));int i, j, k;for(i = 0; i < n1; i++)Left[i] = A[Start + i];for(j = 0; j < n2; j++)Right[j] = A[Mid + 1 + j];i = j = 0;k = Start;while(i < n1 && j < n2){if(Left[i] < Right[j])A[k++] = Left[i++];elseA[k++] = Right[j++];}while(i < n1)A[k++] = Left[i++];while(j < n2)A[k++] = Right[j++];}void MergeSort(int A[], int N, int Start, int End){int Mid;if(Start < End){Mid = (Start + End) / 2;/*printf("sort  (%d-%d, %d-%d) ", Start, Mid, Mid + 1, End);for(int c = 0; c < N; c++){printf("%d ", A[c]);}printf("\n");*/MergeSort(A, N, Start, Mid);MergeSort(A, N, Mid + 1, End);Merge(A, Start, Mid, End);/*printf("merge (%d-%d, %d-%d) ", Start, Mid, Mid + 1, End);for(int c = 0; c < N; c++){printf("%d ", A[c]);}printf("\n");*/}}

耗时Time = 27ms。