星空中的一颗星

#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;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

,捕捉最后的流星,坐在最高的山顶上,可以听音乐,聊电影,

星空中的一颗星

相关文章:

你感兴趣的文章:

标签云: