标签:技术 数组 时间复杂度 i++ div inf 假设 tty +=
如果两个子列一共有N个元素,则归并的时间复杂度是?
T(N) = O(N)
/* L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置 */ void Merge(ElementType A[], ElementType TmpA[], int L, int R, int RightEnd) { LeftEnd = R - 1; /* 左边终点位置。假设左右两列挨着 */ Tmp = L; /* 存放结果的数组的初始位置 */ NumElements = RightEnd - L + 1; while(L <= LeftEnd && R <= RightEnd) { 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(i=0; i<NumElements; i++, RightEnd--) A[RightEnd] = TmpA[RightEnd]; }
T(N)=T(N/2)+T(N/2)+O(N)
T(N)=O(NlogN)
void Merge_Sort(ElementType A[], int N) { ElementType *TmpA; TmpA = malloc(N*sizeof(ElementType)); if(TmpA != NULL) { MSort(A, TmpA, 0, N-1); free(TmpA); } else Error("Space not enough"); }
void Merge_Pass(ElementType A[], ElementType TmpA[], int N, int length) /* length = 当前有序子列的长度 */ { for(i=0;i<=N-2*lenght;i+=2*lenght) Merge1(A, TmpA, i, i+length, i+2*length-1); if(i+length < N) /* 归并最后2个子列 */ Merge1(A, TmpA, i, i+length, N-1); else /* 最后只剩1个子列 */ for(j=i;j<N;j++) TmpA[j] = A[j]; }
void Merge_Sort(ElementType A[], int N) { ElementType *TmpA; TmpA = malloc(N*sizeof(ElementType)); if(TmpA != NULL) { while(length < N) { Merge_pass(A, TmpA, N, length); length *= 2; Merge_pass(TmpA, A, N, length); length *= 2; } free(TmpA); } else Error("Sapce not enough"); }
标签:技术 数组 时间复杂度 i++ div inf 假设 tty +=
原文地址:https://www.cnblogs.com/ch122633/p/9023009.html