在python中插入排序的奇怪错误

时间:2014-11-06 03:47:16

标签: python debugging sorting insertion-sort

我不知道语言,数据类型或算法是否与它有关,但是我用python编写的插入排序得到了这个奇怪的错误。我正在编写它以准备明天的潜在考试问题,并且它有效,但它似乎只适用于数字> = 1.我将演示给出两个不同输入的输出:

#Insertion Sort
#Has some weird bug; only works for numbers >= 1.
def insertion(arr):
    for i in range(1,len(arr)):
        m = arr[i]
        for x in range(i-1,-1,-1):
            if(arr[x] > m):
                arr[x+1] = arr[x]
            else:
                arr[x+1] = m
                break
    return arr

以下是给予该功能的一组输入:

l1 = [1,3,7,2,5,8,4,6]
l2 = [1.1,3.7,7.0,2.5,5.1,8.3,4.0,7.9,6.0]
l3 = [1,3,7,2,5,8,0,4,6]
l4 = [1.1,3.7,7.0,2.5,5.1,8.3,4.0,7.9,6.0,0.3]

以下是与上述输入相关的输出列表

n1 = [1, 2, 3, 4, 5, 6, 7, 8]
n2 = [1.1, 2.5, 3.7, 4.0, 5.1, 6.0, 7.0, 7.9, 8.3]
n3 = [1, 1, 2, 3, 4, 5, 6, 7, 8]
n4 = [1.1, 1.1, 2.5, 3.7, 4.0, 5.1, 6.0, 7.0, 7.9, 8.3]

似乎sort函数将移动值< 1一直到开头,但然后用列表中的最小值替换它们。我认为这是一个非常奇怪的错误,但现在还没有时间去搞清楚(决赛将在下周开始,就像我们在季度系统上一样)。我想也许这里的某个人愿意努力解决它。它可能只是我逻辑中的一个错误,但我觉得奇怪的是它适用于所有1或更大的值。

1 个答案:

答案 0 :(得分:1)

问题是如果m小于之前数组arr中的每个元素,则永远不会设置arr[0] = m。如果arr[x] > m案例始终成立,那么您永远不会在arrm中设置任何条目。因此,您将一直走到前面,将第一个元素复制到第二个位置(当arr[x+1] = arr[x]为0时使用x),但实际上从未在m处插入arr[0] = m for... else的第0个位置。一种(也许是不寻常的)方法是使用Python的else构造,如果你breakfor def insertion(arr): for i in range(1,len(arr)): m = arr[i] for x in range(i-1,-1,-1): if(arr[x] > m): arr[x+1] = arr[x] else: arr[x+1] = m break else: arr[0] = m return arr {循环:

{{1}}