zoukankan      html  css  js  c++  java
  • Python 归并排序法

    归并排序法:是采用分治法的一个非常典型的应用。

    分治法:

    分割:递归地把当前序列平均分割成两半。

    集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。

    #归并排序法

    #1、合并的过程函数

    # left 开始索引下标;m数组中间值下标;right结束索引下标

    def merge(arr,left,m,right):
      n1=m-left+1 #前子数组的长度
      n2=right-m #后子数组的长度

      #创建临时数组
      L=[0]*n1
      R=[0]*n2

      #拷贝数据到临时数组
      for i in range(0,n1): #把前子数组的元素拷贝到左边的临时数组
        L[i]=arr[left+i]

      for j in range(0,n2): #把后子数组的元素拷贝到右边的临时数组
        R[j]=arr[m+1+j]

      #归并临时数组到 arr[1..r]

      #把左右临时数组的元素,按大小合并到原数组中

      i=0  #初始化第一个子数组的索引
      j=0  #初始化第二个子数组的索引
      k=left #初始归并子数组的索引

      while i < n1 and j<n2:
        if L[i]<=R[j]:  【<=:是按有小到大的顺序;>=:是按由大到小的顺序
          arr[k]=L[i]
          i+=1
        else:
          arr[k]=R[j]
          j+=1

      k +=1

      #拷贝 L[] 剩下的保留元素

      #如果右边的数字元素都并入完了,左边数组还有元素,则不需要再进行比较,集中并入
      while i<n1:
        arr[k]=L[i]
        i+=1
        k+=1

      #拷贝 R[]剩下 的保留元素

      #如果左边的数字元素都并入完了,右边数组还有元素,则不需要再进行比较,集中并入
      while j<n2:
        arr[k]=R[j]
        j+=1
        k+=1

    #2、分 的过程

    #先分:一直分到单个元素后,从单个元素再合并的操作

    def mergeSort(arr,left,right):

      if left >= right:
        return

      m=int((left+right)/2)

      mergeSort(arr,left,m) #递归对数列的前半部分进行分开
      mergeSort(arr,m+1,right) #递归对数列的后半部分进行分开
      merge(arr,left,m,right) #从分开后的单个元素开始进行合并

    #测试
    arr=[8,4,7,5,3,1,6,2]
    n=len(arr)

    mergeSort(arr,0,n-1)
    print("排序后的数值")
    for i in range(n):
    print("%d" %arr[i])

  • 相关阅读:
    307. Range Sum Query
    OLI 课程 & Java入学考试的五道题
    745. Prefix and Suffix Search 查找最大index的单词
    38.Count and Say 报数
    721. Accounts Merge合并电子邮件账户
    265. Paint House II 房子涂色K种选择的版本
    【转】如何做人性化的代码审查?从高到低、用例子
    java之struts2之文件下载
    java之struts2之文件上传
    java之struts2之拦截器
  • 原文地址:https://www.cnblogs.com/xiangers/p/15458333.html
Copyright © 2011-2022 走看看