将有序数组 归并排序 最多与最少比较次数

来源:互联网 发布:未来之战怎么清除数据 编辑:程序博客网 时间: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