将有序数组 归并排序 最多与最少比较次数
来源:互联网 发布:未来之战怎么清除数据 编辑:程序博客网 时间:2024/05/17 06:23
今天偶尔看到了归并排序的算法复杂度证明,对于将几个有序数组合并成一个有序数组的比较次数产生了兴趣。
设有两个有序数组 arr1 与 arr2,数组长度分别为 m 与 n, 要合并成一个长度位 m+n 的有序数组 arr3.
最差情况下:比较次数为 m+n-1
此时,将数组 arr1 与数组 arr2 中的元素两两比较,将值小的放进数组 arr3, 直到数组 arr3 填满为止。
因为 arr3 有 m+n 个空位,每次两两比较就放进去一个数,而最后一个剩下的元素可以不用比较直接放进去,所以一共两两比较了 m+n-1 次。
最好情况下:比较次数为 min{m, n}
有个疑问: 若一个数组为 1, 2,3 ; 另一个数组为 4, 5, 6, 7; 则直接将后一个数组最小的与前一个数组最大的比较,仅需一次比较就行了
一定要注意,这是简单归并排序,必须从第一个元素比。
因此,最好情况下,至少需要两两比较一个数组的长度,比较次数为 min{m,n}
java 代码:
import java.util.Arrays;public class HelloWorld { static int[] mergeArray(int[] a, int[] b) {int k = a.length + b.length;int[] c = new int[k];int m = 0; int n = 0;for (int i = 0; i < k; i++) {c[i] = a[m] > b[n] ? b[n++] : a[m++]; // 一共比较了 k-1 次// 最后一个数单独处理if (m == a.length) {c[k-1] = b[n];break;}if (n == b.length) {c[k-1] = a[m];break;}}return c;}public static void main(String[] args) {int[] a = {3, 6, 8, 10};int[] b = {1, 2, 6, 9};int[] c = mergeArray(a, b);System.out.println(Arrays.toString(c));}}
阅读全文
0 0
- 将有序数组 归并排序 最多与最少比较次数
- 两个有序数组归并的平均比较次数的定量分析
- 比较次数最少的排序
- 转成有序数组的最少交换次数
- 两个有序数组(有序段sorted run)简单归并算法的比较次数的分析
- 比较排序的最少比较次数
- 归并排序减少比较次数
- 数组中出现次数最多/最少的元素
- 将两个有序数组归并为一个有序数组
- 将两个有序数组归并成一个有序数组
- poj 2299 交换的最少次数 归并排序
- 合并两个有序数组(归并排序)
- 为什么归并排序比插入排序比较次数要少?
- c++ 数组 有序数组插入 归并排序思想
- 【留坑】UVA10810 求逆序对==求最少相邻元素交换次数 归并排序OR线段树OR树状数组
- 归并之将两个有序数组合并(已测试)
- 有序数组归并和有序单链表归并
- 使序列有序的最少交换次数
- 轻松记住大端小端的含义(附对大端和小端的解释)
- 前端学习笔记篇之git那些事
- IDEA 下使用maven 创建 MapReduce(配置环境 Mac OS)
- python描述选择排序
- 迁移学习
- 将有序数组 归并排序 最多与最少比较次数
- Centos搭建ceph+++四、yum源设置
- How to modify the xml in sql server
- Linux下使用-static -lpthread静态编译出现段错误(Segmentation fault)
- MQTT协议_服务质量
- 配置命令对比(2)——VLAN【Cisco::H3C】
- WebService与Oracle EBS
- python2.7遇到的问题
- SpringMVC全局异常统一处理