用python实现归并排序

def merge(lfrom, lto, low, mid, high):
    i, j, k = low, mid, low
    while i < mid and j < high:
        if lfrom[i] < lfrom[j]:
            lto[k] = lfrom[i]
            i += 1
        else:
            lto[k] = lfrom[j]
            j += 1
        k += 1
    while i < mid:
        lto[k] = lfrom[i]
        i += 1
        k += 1
    while j < high:
        lto[k] = lfrom[j]
        j += 1
        k += 1

def merge_pass(lfrom, lto, llen, slen):
    i = 0
    while i+2*slen < llen:
        merge(lfrom, lto, i, i+slen, i+2*slen)
        i += 2*slen
    if i + slen < llen:
        merge(lfrom, lto, i, i+slen, llen)
    else:
        for j in range(i, llen):
            lto[j] = lfrom[j]

def merge_sort(lst):
    slen, llen = 1, len(lst)
    templist = [None]*llen
    while slen < llen:
        merge_pass(lst, templist, llen, slen)
        slen *= 2
        merge_pass(templist, lst, llen, slen)
        slen *= 2

归并排序的思想是:

  1. 跟快速排序从长序列排到短序列相反,归并排序是先排短的,再排长的。
  2. 对于一个序列,一开始视每一个元素为一个序列,两两合并。对于每一个“两两合并”,就是将两个排好序的序列合并的过程。
  3. 归并排序需要开辟和原序列一样大的空间。归并一遍的结果放到开辟的空间中。第二次的归并是从新空间归并到旧空间,如此反复就把序列排序了。
  4. 实现一共分为三个层级:
  • 最低层级: 将两个已排序序列合并
  • 中间层级:将整个序列,根据子序列长度,分别归并
  • 最高层级:将子序列长度从1开始翻倍增加,直到子序列长度和序列长度一样,归并完成。
时间: 2024-08-11 17:53:03

用python实现归并排序的相关文章

利用Python实现归并排序

利用python进行归并排序,摘抄自http://blog.csdn.net/minxihou/article/details/51821052 "代码真的不是一气呵成的,而且也不是想当然写出来的.可能需要反复断点中断来查看是否有逻辑错误.在理解了问题的基础下我们需要先把大体的代码框架最好先写出来,特别是主要的逻辑判断语句.但是不需要太care我循环体或者判断里面语句怎么实现,当你把这一步做到的时候能避免很多不必要的错误发生." 1 import random 2 3 def Conf

python实现归并排序,归并排序的详细分析。

学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的伙伴可以看下我之前发表的文章http://www.cnblogs.com/Lin-Yi/p/7301535.html看完之后也许你会对时间复杂度有一个新的认识. 我谈的观点往往不是官方的定义,我希望能帮助更多基础薄弱的同学读懂思想~ 归并排序: 先分开再合并,分开成单个元素,合并的时候按照正确顺序合

python实现归并排序,归并排序的详细分析

学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的伙伴可以看下我之前发表的文章http://www.cnblogs.com/Lin-Yi/p/7301535.html看完之后也许你会对时间复杂度有一个新的认识. 我谈的观点往往不是官方的定义,我希望能帮助更多基础薄弱的同学读懂思想~ 归并排序: 先分开再合并,分开成单个元素,合并的时候按照正确顺序合

【Python实现归并排序】 &#213125;

原文: http://blog.gqylpy.com/gqy/347 "首先,归并排序使用了二分法,归根到底的思想还是分而治之.拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去.然后再将它们按照两个有序数组的样子合并起来.这样说起来可能很难理解,所以 图就来了: 归并排序将数组以中间的值进行拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序. 两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后将放入空数组的那个

python版归并排序

1 def merge(ll, rr): 2 i = 0 3 j = 0 4 num = [] 5 while i < len(ll) and j < len(rr): 6 if ll[i] < rr[j]: 7 num.append(ll[i]) 8 i += 1 9 else: 10 num.append(rr[j]) 11 j += 1 12 if i != len(ll): 13 num += ll[i:] 14 else: 15 num += rr[j:] 16 return

python中归并排序

1 # coding=UTF-8 2 #!/usr/bin/python 3 4 import sys 5 6 def merge(nums, first, middle, last): 7 "merge" 8 #切片边界,左闭右开,从0开始 9 lnums = nums[ first:middle+1 ] 10 rnums = nums[ middle+1:last+1 ] 11 lnums.append(sys.maxint) 12 rnums.append(sys.maxint)

python代码 归并排序 merge sort

1: def mergesort(seq): 2: if len(seq)<=1: 3: return seq 4: mid=len(seq)/2 5: left=mergesort(seq[:mid]) 6: right=mergesort(seq[mid:]) 7: return merge(left,right) 8:   9: def merge(left,right): 10: result=[] 11: i,j=0,0 12: while i<len(left) and j<

Python实现归并排序

import sys def merge(nums,first,middle,last):  lnums = nums[first:middle+1]  rnums = nums[middle+1:last+1]  lnums.append(sys.maxint)  rnums.append(sys.maxint)  l=0  r = 0 for i in range(first,last+1):  if lnums[l] <rnums[r]:    nums[i] = lnums[l]   

python 实现归并排序

import random # 我也是想了很久才想明白,递归用的太少了.画下图自己模拟一下就行了. # 先递归分成单个元素,然后排序. # 排序的函数传入的值是两个连续的数组. # 因为单个元素的时候就进行排序,所以返回的一left_half,right_half 一定是排好序的 def merge_sort(seq): if len(seq) <=1: # 只有一个元素时是递归出口 return seq else: mid = int(len(seq)/2) left_half = merge