合并排序

合并排序是一种通过分治模式解决排序问题的算法,这种排序算法根据具体细节的不同可以有很多实现。他拥有O(N logN)的最差运行时间,而且是一个很好的递归实例。

实现合并排序最重要的是递归的base case和边界条件的处理,如下是对整型数组的合并排序Java实现。

  1. public static void mergesort(int[] array, int[] temp, int start, int end) {
  2.   if (start == end) return;
  3.   int center = (start + end)/2;
  4.   mergesort(array, temp, start, center);
  5.   mergesort(array, temp, center+1, end);
  6.   int left = start;
  7.   int right = center + 1;
  8.   int current = left;
  9.   while(left<=center&&right<=end) {
  10.    if (array[left]<=array[right]) {
  11.     temp[current++] = array[left++];
  12.    } else {
  13.     temp[current++] = array[right++];
  14.    }
  15.   }
  16.   while(left<=center) {
  17.    temp[current++] = array[left++];
  18.   }
  19.   while(right<=end) {
  20.    temp[current++] = array[right++];
  21.   }
  22.   for (int i = start; i <= end; i++) {
  23.    array[i] = temp[i];
  24.   }
  25.  }

请注意以上代码中temp的运用,它被声明为一个和待排序数组相同大小的数组,并被传入方法中。我们可以使用它的任意部分作为中间结果的存储,这样就免于每次调用声明一个local数组,从而达到内存的高效使用。当然,这还不是最有效的解决方法,我们甚至可以使用更少的内存,但是算法的实现将变得相当复杂。

以上的实现将所有的代码包含在一个方法中,显然不是良好的程序设计风格,我们可以做如下改进。

  1. public static void mergesort(int[] array, int[] temp, int start, int end) {
  2.   if (start == end) return;
  3.   int center = (start + end)/2;
  4.   mergesort(array, temp, start, center);
  5.   mergesort(array, temp, center+1, end);
  6.   merge(array, temp, start, center+1, end);
  7.  }
  8.  public static void merge(int[] array, int[] temp, int left, int right, int end) {
  9.   int start = left;
  10.   int center = right - 1;
  11.   int current = left;
  12.   while(left<=center&&right<=end) {
  13.    if (array[left]<=array[right]) {
  14.     temp[current++] = array[left++];
  15.    } else {
  16.     temp[current++] = array[right++];
  17.    }
  18.   }
  19.   while(left<=center) {
  20.    temp[current++] = array[left++];
  21.   }
  22.   while(right<=end) {
  23.    temp[current++] = array[right++];
  24.   }
  25.   for (int i = start; i <= end; i++) {
  26.    array[i] = temp[i];
  27.   }
  28.  }

如此代码中divide和merge的部分就分离在两个方法中,通过传递参数达到和第一段代码相同的排序作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值