将排序数组合并到单个排序数组中:Python

将排序数组合并到单个排序数组中:Python,python,Python,我想将两个已经排序的数组排序为一个。为此,我正在使用合并排序 错误::索引器错误:列表索引超出范围 我已尝试手动签出此项,但找不到超出范围的阵列。如果我错了,请纠正我 def merging(list1, list2): m = len(list1) n = len(list2) val = m+n j, k = 0, 0 new =[] for i in range(val): if j<m and k<n:

我想将两个已经排序的数组排序为一个。为此,我正在使用合并排序

错误::索引器错误:列表索引超出范围

我已尝试手动签出此项,但找不到超出范围的阵列。如果我错了,请纠正我

def merging(list1, list2):
    m = len(list1)
    n = len(list2)
    val = m+n
    j, k =  0, 0
    new =[]
    for i in range(val):
        if j<m and k<n:
           if list1[j] < list2[k]:
              new.append(list1[j])
              j += 1
           else:
              new.append(list2[k])     
              k += 1

       elif j==m:
          while i<m+n:
            new.append(list2[k])
            k += 1
            i += 1
       else:
        while i<m+n:
            new.append(list1[j])
            j += 1
            i += 1

print 'sorted array is:', new

if __name__ == '__main__':
    print 'Enter list 1'
    l1 = raw_input()
    list1 = map(int, l1.split())
    print 'Enter list 2'
    l2 = raw_input()
    list2 = map(int, l2.split())
    merging(list1,list2)
def合并(列表1、列表2):
m=len(列表1)
n=len(列表2)
val=m+n
j、 k=0,0
新=[]
对于范围内的i(val):
如果j很抱歉混淆了

问题是您无法更改i的值,因为i在范围(val)内

def合并(列表1、列表2):
m=len(列表1)
n=len(列表2)
val=m+n
j、 k=0,0
新=[]
对于范围内的i(val):
如果j您有两个问题:

  • 当到达
    elif
    else
    情况时,您不会
    中断
    ,因此外部循环将继续(而
    for
    循环忽略在循环内部对
    i
    所做的更改);及
  • 您永远不会返回新的
  • 最基本的解决方案是:

    def merging(list1, list2):
        m = len(list1)
        n = len(list2)
        val = m+n
        j, k =  0, 0
        new =[]
        for i in range(val):
            if j<m and k<n:
                 if list1[j] < list2[k]:
                    new.append(list1[j])
                    j += 1
                 else:
                    new.append(list2[k])     
                    k += 1
    
            elif j==m:
                while i<m+n:
                    new.append(list2[k])
                    k += 1
                    i += 1
                break # stop for loop here
            else:
                while i<m+n:
                    new.append(list1[j])
                    j += 1
                    i += 1
                break # or here
        return new # and return the output
    
    def合并(列表1、列表2):
    m=len(列表1)
    n=len(列表2)
    val=m+n
    j、 k=0,0
    新=[]
    对于范围内的i(val):
    如果j
    def合并(列表1、列表2):
    m=len(列表1)
    n=len(列表2)
    res=[]
    a、 b=0,0
    当a
    以下是一个返回生成器并可用于所有iTerable的版本:

    def合并(g1、g2):
    i1,i2=iter(g1),iter(g2)
    e1,e2=无,无
    尝试:
    e1=下一个(i1)
    e2=下一个(i2)
    尽管如此:
    如果e1
    您能给出它不起作用的列表吗。在某些情况下,这是可行的。无论如何,您确实意识到,当list1的大小大于list2时,simplest可以正常工作,您确实意识到最简单的方法是:
    l_new=list1+list2;l_new.sort()
    我已经说过我不想使用预定义函数!
    def merging(list1, list2):
        m = len(list1)
        n = len(list2)
        val = m+n
        j, k =  0, 0
        new =[]
        for i in range(val):
            if j<m and k<n:
                 if list1[j] < list2[k]:
                    new.append(list1[j])
                    j += 1
                 else:
                    new.append(list2[k])     
                    k += 1
    
            elif j==m:
                while i<m+n:
                    new.append(list2[k])
                    k += 1
                    i += 1
                break # stop for loop here
            else:
                while i<m+n:
                    new.append(list1[j])
                    j += 1
                    i += 1
                break # or here
        return new # and return the output
    
    def merge(l1, l2):
        """Merge the sorted lists into a new, single list."""
        i = j = 0
        out = []
        while True:
            if i == len(l1):
                out.extend(l2[j:])
                break
            elif j == len(l2):
                out.extend(l1[i:])
                break
            elif l1[i] <= l2[j]:
                out.append(l1[i])
                i += 1
            else:
                out.append(l2[j])
                j += 1
        return out
    
    def merging(list1, list2):
        m = len(list1)
        n = len(list2)
        res = []
        a, b = 0, 0
        while a < m and b < n:
            if list1[a] < list2[b]:
                res.append(list1[a])
                a += 1
            else:
                res.append(list2[b])
                b += 1
        if a == m:
            for i in list2[b:]:
                res.append(i)
        else:
             for i in list1[a:]:
                 res.append(i)
        return res
    
    if __name__ == '__main__':
        print 'Enter list 1'
        l1 = raw_input()
        list1 = map(int, l1.split())
        print 'Enter list 2'
        l2 = raw_input()
        list2 = map(int, l2.split())
        print merging(list1,list2)