首页 > 代码库 > 二路归并排序
二路归并排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。
以n个元素的数组为例:可以看作为n个有序的子表,每个子表的长度为1,然后两两合并,得到n/2个长度为2或1的有序子表。然后再两两合并......如此重复,直到合并为一个长度为n的有序表为止。
以下是用递归法实现的二路归并排序算法:
void MergeSort(int *a, int n) { MergePart(a, 0, n - 1); } void MergePart(int *a, int low, int high) { if (low < high){ //递归的终止条件 int mid = (low + high) / 2; //从中间划分两个子序列 MergePart(a, low, mid); //对左侧子序列进行递归排序 MergePart(a, mid + 1, high); //对右侧子序列进行递归排序 Merge(a, low, mid, high); //归并 } } void Merge(int *a, int low, int mid, int high) { int i = mid, j = high, k; for (k = low; k <= high; ++k) //将a中的元素复制到b中,b是一个辅助数组,可以设置为一个全局变量 b[k] = a[k]; k = high; //以b中mid为界,依次从左右两端有序元素中选择最大的元素放入a中 while (i >= low && j > mid) a[k--] = b[i] > b[j] ? b[i--] : b[j--]; //以下这两个while只会执行一个 //作用是将剩下的有序元素全部放入a中剩下的空间 while (i >= low) a[k--] = b[i--]; while (j > mid) a[k--] = b[j--]; }
二路归并排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。