合并排序 Python 2.7 倍

Merge Sort Python 2.7x

函数 merge() 工作正常但 merge_sort 不是,使用 merge_sort() 后 ls 和 rs 的值没有改变。请帮助找出问题所在,我已经坚持了几个小时。

def merge_sort(arr):


  def merge(sub_arr,p,q):

    L = []
    R = []

    for i in range(p):
        L.append(sub_arr[i])
        #print L

    for i in range(q-p):
        R.append(sub_arr[p+i])
        #print R

    L.append('n')
    R.append('n')

    j=k=0

    for i in range(q):

        if L[j] < R[k] :

            sub_arr[i] = L[j]
            j += 1

        else:

            sub_arr[i] = R[k]
            k += 1


  if len(arr) > 1 :

    ls = arr[:len(arr)/2]
    rs = arr[len(arr)/2:]


    merge_sort(ls)
    #print ls
    merge_sort(rs)
    #print rs



    arr = ls + rs

    #print arr

    merge (arr,len(arr)/2,len(arr))
    #print arr




x = map(int,raw_input('Enter sequence:').strip().split())

merge_sort(x)

print x

问题在于行

arr = ls + rs

您不再对传递给 merge_sort 的列表调用合并,而是对副本调用它。所以原始列表没有被修改。要更正此问题,您可以在末尾使用 merge_sort 函数 return arr,然后分配 ls = merge_sort(ls)(与 rs 类似)。完成后,您的代码应该可以工作了。

正确的版本在这里..

def merge_sort(arr):
  def merge(sub_arr,p,q):
    L = []
    R = []
    for i in range(p):
        L.append(sub_arr[i])
    for i in range(q-p):
        R.append(sub_arr[p+i])
    L.append('n')
    R.append('n')
    j=k=0
    for i in range(q):
        if L[j] < R[k] :
            sub_arr[i] = L[j]
            j += 1
        else:
            sub_arr[i] = R[k]
            k += 1
  if len(arr) > 1 :
    ls = arr[:len(arr)/2]
    rs = arr[len(arr)/2:]
    ls = merge_sort(ls)
    rs = merge_sort(rs)    
    arr = ls + rs
    merge (arr,len(arr)/2,len(arr))
  return arr

这给出了预期的结果

>>> x = map(int,raw_input('Enter sequence:').strip().split())
Enter sequence:4 5 2 1 3 4 6
>>> y = merge_sort(x)
>>> print x
[4, 5, 2, 1, 3, 4, 6]
>>> print y
[1, 2, 3, 4, 4, 5, 6]