全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

老生常谈比较排序之归并排序(递归)

归并排序里运用到算法里很重要的一个思想——分治法:将原问题分解为几个规模较小但类似于原问题的子问题——《算法导论》。

在每一层递归中都有3个步骤:

1.分解问题

2.解决问题

3.合并问题的解

举例待排序数组:{6, 5, 3, 1, 7, 2, 4},将它原始序列做分解。

可以经过不断的递归分解可以看到已经把原始数组序列不断分解为最小单位,接下来不妨将它们看做是二叉树的叶子节点。

    

将他们进行两两归并排序形成二叉树(也称为2路归并算法),可见二叉树的根节点即为最终序列。在这个过程中我们完成了剩余的两个步骤:解决问题和合并问题。

理论很简单,实践很“复杂”。对于归并排序的理论从上面的二叉树就看的很明白,将原始待排序数组不断分解最后看成是二叉树的叶子节点,再把它们两两排形成新的节点,逐渐归并为一个节点,此时的节点即为排好序的数组序列。

Java

package com.algorithm.sort.merge;

import java.util.Arrays;

/**
 * 归并排序(递归)
 * Created by yulinfeng on 2017/6/23.
 */
public class Merge {
  public static void main(String[] args) {
    int[] nums = {6, 5, 3, 1, 7, 2, 4};
    nums = mergeSort(nums);
    System.out.println(Arrays.toString(nums));
  }

  /**
   * 归并排序
   * @param nums 待排序数组序列
   * @return 排好序的数组序列
   */
  private static int[] mergeSort(int[] nums) {
    segment(nums, 0, nums.length - 1);
    return nums;
  }

  /**
   * 递归切分待排
   * @param nums 待切分数组
   * @param left 待切分最后第一个元素的索引
   * @param right 待切分数组最后一个元素的索引
   */
  private static void segment(int[] nums, int left, int right) {
    if (left >= right)
      return;
    // 找出中间索引
    int center = (left + right) / 2;
    // 对左边数组进行递归
    segment(nums, left, center);
    // 对右边数组进行递归
    segment(nums, center + 1, right);
    // 合并
    merge(nums, left, center, right);
  }

  /**
   * 两两归并排好序的数组(2路归并)
   * @param nums 带排序数组对象
   * @param left 左边数组的第一个索引
   * @param center 左数组的最后一个索引,center + 1右数组的第一个索引
   * @param right 右数组的最后一个索引
   */
  private static void merge(int[] nums, int left, int center, int right) {
    int[] tmpArray = new int[nums.length];
    int rightIndex = center + 1;  // 右数组第一个元素索引
    int tmpIndex = left;  //临时数组索引
    int begin = left;  // 缓存左数组第一个元素的索引,用于将排好序的数组拷贝回原数组
    while (left <= center && rightIndex <= right) {
      if (nums[left] <= nums[rightIndex]) {
        tmpArray[tmpIndex++] = nums[left++];
      } else {
        tmpArray[tmpIndex++] = nums[rightIndex++];
      }
    }
    while (left <= center) {
      tmpArray[tmpIndex++] = nums[left++];
    }
    while (rightIndex <= right) {
      tmpArray[tmpIndex++] = nums[rightIndex++];
    }
    while (begin <= right) {
      nums[begin] = tmpArray[begin++];
    }
  }
}

Python3

#二路归并排序(递归)
def merge_sort(nums):
  segment(nums, 0, len(nums) - 1)
  return nums

#切分待排序数组
def segment(nums, left, right):
  if left >= right:
    return
  center = int((left + right) / 2)
  segment(nums, left, center)
  segment(nums, center + 1, right)
  merge(nums, left, center, right)

#两两归并排好序的数组(二路归并)
def merge(nums, left, center, right):
  tmpArray = [0] * len(nums)
  rightIndex = center + 1   #右数组的第一个元素索引
  tmpIndex = left
  begin = left
  while left <= center and rightIndex <= right:
    if nums[left] <= nums[rightIndex]:
      tmpArray[tmpIndex] = nums[left]
      tmpIndex += 1
      left += 1
    else:
      tmpArray[tmpIndex] = nums[rightIndex]
      tmpIndex += 1
      rightIndex += 1
  while left <= center:
    tmpArray[tmpIndex] = nums[left]
    tmpIndex += 1
    left += 1
  while rightIndex <= right:
    tmpArray[tmpIndex] = nums[rightIndex]
    tmpIndex += 1
    rightIndex += 1
  while begin <= right:
    nums[begin] = tmpArray[begin]
    begin += 1

nums = [6, 5, 3, 1, 7, 2, 4]
nums = merge_sort(nums)
print(nums)

以上这篇老生常谈比较排序之归并排序(递归)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# 归并排序  # 递归  # C#递归算法之归并排序  # 归并排序的递归实现与非递归实现代码  # C#归并排序的实现方法(递归  # 非递归  # 自然归并)  # 第一个  # 切分  # 二叉树  # 给大家  # 解决问题  # 即为  # 二路  # 几个  # 都有  # 在这个  # 老生常谈  # 希望能  # 很简单  # 很重要  # 可以看到  # 就看  # 这篇  # 将它  # 较小 


相关文章: 创业网站制作流程,创业网站可靠吗?  建站之星后台密码遗忘如何找回?  如何在云主机快速搭建网站站点?  如何通过FTP服务器快速搭建网站?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  韩国服务器如何优化跨境访问实现高效连接?  如何选择高效响应式自助建站源码系统?  建站之星代理如何优化在线客服效率?  小建面朝正北,A点实际方位是否存在偏差?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  独立制作一个网站多少钱,建立网站需要花多少钱?  如何选择建站程序?包含哪些必备功能与类型?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  广东企业建站网站优化与SEO营销核心策略指南  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  常州自助建站工具推荐:低成本搭建与模板选择技巧  Java解压缩zip - 解压缩多个文件或文件夹实例  h5网站制作工具有哪些,h5页面制作工具有哪些?  b2c电商网站制作流程,b2c水平综合的电商平台?  定制建站是什么?如何实现个性化需求?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  贸易公司网站制作流程,出口贸易网站设计怎么做?  如何在搬瓦工VPS快速搭建网站?  如何在阿里云虚拟主机上快速搭建个人网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  设计网站制作公司有哪些,制作网页教程?  建站VPS能否同时实现高效与安全翻墙?  音响网站制作视频教程,隆霸音响官方网站?  如何在IIS中配置站点IP、端口及主机头?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  如何选择域名并搭建高效网站?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何快速辨别茅台真假?关键步骤解析  建站与域名管理如何高效结合?  网站制作说明怎么写,简述网页设计的流程并说明原因?  建站主机核心功能解析:服务器选择与网站搭建流程指南  如何通过西部数码建站助手快速创建专业网站?  动图在线制作网站有哪些,滑动动图图集怎么做?  建站之星代理平台如何选择最佳方案?  如何通过WDCP绑定主域名及创建子域名站点?  如何在Tomcat中配置并部署网站项目?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何选择高效稳定的ISP建站解决方案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。