👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> 458290771@qq.com
喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏
定义
合并:把两个或多个已经有序的序列合并成一个
设置三个指针 i , j , k i,j,k i,j,k ,对比 i , j i,j i,j所指元素,选择一个更小的放入 k k k 所指的位置
只剩一个子表未合并时,可以将该表中剩余元素全部加到总表
二路归并
也就是上面的过程↑:二合一
四路归并
设置五个指针 p 1 , p 2 , p 3 , p 4 , k p_1,p_2,p_3,p_4,k p1,p2,p3,p4,k ,对比 p 1 , p 2 , p 3 , p 4 p_1,p_2,p_3,p_4 p1,p2,p3,p4 所指元素,选择一个更小的放入 k k k 所指位置
四路归并 —— 每选出一个小元素需要对比关键字3次
代码实现
int *B = (int *) malloc (n * sizeof(int)); // 辅助数组B// A[low...mid]和A[mid+1,...,high]各自有序,将两个部分合并
void Merge(int A[], int low, int mid, int high){int i, j, k;for(k = low; k <= high; k++)B[k] = A[k]; // 将A中所有元素复制到B中for(i = low, j = mid + 1, k = i; i <= mid && j <= high; k++){if(B[i] <= B[j])A[k] = B[i++]; // 将较小的值复制到A中elseA[k] = B[j++];}while(i <= mid) A[k++] = B[i++];while(j <= high) A[k++] = B[j++];
}void MergeSort(int A[], int low, int high){if(low < high){int mid = (low + high) / 2; // 从中间划分MergeSort(A, low, mid); // 对左半部分归并排序MergeSort(A, mid + 1, high); // 对右半部分归并排序Merge(A, low, mid, high); // 归并}
}
算法效率分析
2路冰柜的归并树,形态上就是一棵倒立的二叉树
结论:
n个元素进行2路归并排序,归并趟数 = l o g 2 n =log_2n =log2n
每趟归并时间复杂度为 O ( n ) O(n) O(n),则算法时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
空间复杂度 = O ( n ) =O(n) =O(n),来自辅助数组B