关闭

Python实现归并排序

标签: 归并排序python
134人阅读 评论(0) 收藏 举报
分类:
def mergeSort(seq):  
    if len(seq)<=1:  
        return seq 
    else:     
      mid=int(len(seq)//2)  
      Lpart=mergeSort(seq[:mid])  
      Rpart=mergeSort(seq[mid:])  
      return merge(Lpart,Rpart)  

def merge(Lpart,Rpart):  
    newList = list() 
    a,b=0,0  
    while a<len(Lpart) and b<len(Rpart):  
        if Lpart[a]<=Rpart[b]:  
            newList.append(Lpart[a])  
            a+=1  
        else:  
            newList.append(Rpart[b])  
            b+=1  
    while a < len( Lpart ) :
      newList.append(Lpart[a]) 
      a+=1
    while b < len( Rpart ) :
      newList.append(Rpart[b]) 
      b+=1    

    return newList 

if __name__=='__main__':  
    seq=[23,34,4,5,23,-1,67,55]  
    print(mergeSort(seq))  

mergeSort() 函数提供了一个归并算法的简单的递归实现,但它有几个缺点。首先,它依赖于分片操作,这就阻止了我们使用这个函数来给数组排序,因为数组结构没有提供分片操作。第二,每次递归调用时列表被划分,都创建新的物理子列表。 而分片是一个耗时操作,因为必须创建一个新的列表,把分片的内容从初始列表复制过去。
每次两个子列表合并时又要创建一个新列表,整个处理过程增加了更过时间。
最后,排好序的列表没有被包含进传给函数的同一个初始列表中。

一个更好的实现

# 使用归并排序升序排序一个数组或列表
def mergeSort( theSeq ):
  n = len( theSeq )
# 创建合并子序列时使用的临时数组
  tmpArray = Array( n )
# 调用私有的递归合并排序函数
  recMergeSort( theSeq, 0, n-1, tmpArray )


 #使用归并排序按升序排序一个虚拟子序列
def recMergeSort( theSeq, first, last, tmpArray ):
 # 比较虚拟子序列的元素由范围[first...last]指定
 # tmpArray 在归并排序算法的合并阶段用来做临时存储

 # 检查基本情况: 虚拟序列只包含单一项
  if first == last :
    return;
  else :
# 计算出中间点
  mid = (first + last) // 2

# 分开序列并执行递归
  recMergeSort( theSeq, first, mid, tmpArray )
  recMergeSort( theSeq, mid+1, last, tmpArray )

 # 合并两个排好序的子序列
  mergeVirtualSeq( theSeq, first, mid+1, last+1, tmpArray )
# 合并两个排好序的虚拟子序列: [left..right) [right..end)
# 使用tmpArray 做中间存储.

def mergeVirtualSeq( theSeq, left, right, end, tmpArray ):
# 初始化两个子序列索引变量 
  a = left
  b = right
# 为合并完的结果数组初始化一个索引变量
  m = 0
 # 合并两个序列直到其中一个为空.
  while a < right and b < end :
    if theSeq[a] < theSeq[b] :
      tmpArray[m] = theSeq[a]
      a += 1
    else :
      tmpArray[m] = theSeq[b]
      b += 1
    m += 1

# 如果左边的子序列包含更多的项则把它们追加到tmpArray.
  while a < right :
    tmpArray[m] = theSeq[a]
    a += 1
    m += 1

# 如果左边的子序列包含更多的项则把它们追加到tmpArray
  while b < end :
    tmpArray[m] = theSeq[b]
    b += 1
    m += 1

# 把排好序的子序列复制回初始序列中
  for i in range( end - left ):
    theSeq[i+left] = tmpArray[i]
0
0
查看评论

利用Python实现归并排序

在讲归并排序之前我们先来了解一下什么是分治算法。为什么归并排序属于分治算法的体现。 分治算法分治算法基本思想就是将一个比较大规模的问题分解成为若干个规模较小的问题来解决。这些小问题相当于是原问题的子集并且相互独立。每个子集的性质和原问题性质必须要保持一致。 分治算法特征1. 该问题可以分解成为程序...
  • minxihou
  • minxihou
  • 2016-07-04 15:09
  • 2163

归并排序及Python实现

归并排序原理 假如有两堆已经排列好的扑克牌,面朝上地放在桌面上,要把这两堆扑克牌合成一堆排列好的扑克牌,怎么做呢?很简单,每一次从两堆牌中选择数值比较小的牌,放入输出牌堆中,一直重复下去就能得到一副排序好的扑克牌 如:扑克牌1:[2, 4, 5],扑克牌2:[3, 6, 7]。 第一次比较牌面...
  • Vincent_Zheng73
  • Vincent_Zheng73
  • 2015-04-22 16:36
  • 262

用Python实现八大排序算法--归并排序

一、归并排序概述1.归并排序将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。 综上可知: 归并排序其实要做两件事: (1)“...
  • chibangyuxun
  • chibangyuxun
  • 2016-11-02 21:02
  • 572

用归并排序实现单链表的排序

今天做了百度的一套数据挖掘的笔试题,其中有一道对单链表进行归并排序,因为刚学归并排序的时候是针对数组来说,所以这道题着实费了一点心思。 考点:1归并算法2单双步求中点3链表指针的操作,以及边界空指针问题4内存分配与回收; 单链表与数组相比只能顺序访问每个元素,因此在使用二路归并排序时关键在于找到链表...
  • u010159842
  • u010159842
  • 2015-05-14 21:01
  • 696

python实现归并排序

#归并排序,先分 def Merge(str,start_index,end_index,mid,temp):     j=start_index     k=mid+1     i=0     while j...
  • helina00
  • helina00
  • 2014-06-20 15:10
  • 296

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度 1.快速排序
  • u011608357
  • u011608357
  • 2014-07-12 13:34
  • 986

归并排序详解(python实现)

归并排序详解(python实现)
  • jacke121
  • jacke121
  • 2017-10-06 09:35
  • 149

二路归并排序Python实现

用Python  实现 二路归并排序算法
  • u010339879
  • u010339879
  • 2017-10-16 16:33
  • 55

python实现快速排序和归并排序

快排基本思想: 按照某种标准将序列划分为“小记录”和“大记录”,并通过递归不断划分。 思想如图所示: 其中,R为枢轴元素 代码实现如下:
  • chinwuforwork
  • chinwuforwork
  • 2016-06-04 11:52
  • 322

Python实现二路归并排序

# -*- coding:utf-8 -*-   def merge(left,right):          i , j = 0,0     lists = []     wh...
  • lz_1992
  • lz_1992
  • 2015-12-29 21:40
  • 189
    个人资料
    • 访问:9557次
    • 积分:359
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:14篇
    • 评论:3条