#include<stdio.h>
#include<stdlib.h>
//复杂度分析
//T(N) = T(N/2) + T(N/2) + O(N) T(N) = O(NlogN)
//归并作用是将两个序列合并 L = 左边起始位置,R = 右边起始位置 RightEnd = 右边终点位置
void Merge(int A[],int TmpA[],int L,int R,int RightEnd)
{
int LeftEnd = R -1; //左边终点位置 左右两列挨着
int Tmp = L; //存放结果初始位置
int NumElements = RightEnd - L + 1; //存放元素总个数
while(L <= LeftEnd && R<= RightEnd) //当左右两边都存在元素时比较大小将小的哪一个存入数组Tmp中
{
if(A[L] <A[R] ) //如果左边的值小则将左边的元素存入数组中
TmpA[Tmp++] = A[L++];
else //反之
TmpA[Tmp++] = A[R++];
}
while(L <= LeftEnd) //如果左边的数组长一点则将后面的直接存入数组
TmpA[Tmp++] = A[L++];
while(R <= RightEnd)
TmpA[Tmp++] = A[R++]; //反之
for(int i = 0; i < NumElements;i++,RightEnd --) //用NumElem来控制赋值的次数
A[RightEnd] = TmpA[RightEnd];
}
//归并排序 一直递归 然后返回进行排序 L = 初始位置 RightEnd = 结束位置
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 Merge_sort(int A[],int N)
{
// int *TmpA; //动态分配一个和A数组等大的数组TmpA
//TmpA = (int *)malloc(sizeof(A));
int TmpA[100];
MSort(A,TmpA,0,N-1);
}
int main()
{
int a[11] = {1,3,5,7,9,2,4,6,8,10,20};
int b[11] = {0}; //从当temp数组
// Merge(a,b,0,5,10); //合并的测试
MSort(a,b,0,10);
for(int i=0;i<11;i++)
{
printf("%d ",a[i]);
if(i==10)
printf("\n");
}
int c[11] = {1,9,5,2,3,4,6,7,8,5,2};
MSort(c,b,0,10);
for(int i=0;i<11;i++)
{
printf("%d ",c[i]);
if(i==10)
printf("\n");
}
/
int d[5] = {3,8,6,5,2};
Merge_sort(d,5);
for(int i=0;i<5;i++)
{
printf("%d ",d[i]);
if(i==4)
printf("\n");
}
system("pause");
return 0;
}
归并排序及具体介绍
最新推荐文章于 2023-09-03 20:36:33 发布