Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 插入排序算法有问题_Python_Algorithm_Sorting_Insertion Sort - Fatal编程技术网

Python 插入排序算法有问题

Python 插入排序算法有问题,python,algorithm,sorting,insertion-sort,Python,Algorithm,Sorting,Insertion Sort,我正在做一项作业,作业中给我们一个不超过10^6个数字的文本文档。可以是正面的,也可以是负面的。然后,我们的任务是创建一个函数,该函数使用插入排序算法将列表排序到一个定义的索引,该索引可能包括也可能不包括整个列表。然后,我们需要它输出排序后的列表,以及算法移动项进行排序的次数(或者需要迭代多少次才能对整个列表进行排序) 我用一个示例列表对它进行排序,然后输出排序,我就是这样做的 arr = [1,9,6,5,4,3,5,2] n = 8 def insertionSort(arr, n):

我正在做一项作业,作业中给我们一个不超过10^6个数字的文本文档。可以是正面的,也可以是负面的。然后,我们的任务是创建一个函数,该函数使用插入排序算法将列表排序到一个定义的索引,该索引可能包括也可能不包括整个列表。然后,我们需要它输出排序后的列表,以及算法移动项进行排序的次数(或者需要迭代多少次才能对整个列表进行排序)

我用一个示例列表对它进行排序,然后输出排序,我就是这样做的

arr = [1,9,6,5,4,3,5,2]
n = 8

def insertionSort(arr, n):
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = key
    return arr

insertionSort(arr, n)

print(arr)
打印出来的和以前一样。因此,我根据错误移动了一些内容,并在以下位置结束:

arr = [1,9,6,5,4,3,5,2] #[open("rosalind_ins.txt").read().split(' ')]
n = 8
counter = 0

def insertionSort(arr, n):
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
            counter += 1
        arr[j+1] = key
    return arr, counter

insertionSort(arr, n)
print(counter)
print(arr)
此列表中有近1000项。 我在这里收到的错误是

File "insertionSort.py", line 17, in insertionSort
    key = arr[i]
IndexError: list index out of range
我为文字墙道歉,可能还问了一个简单的问题,但我已经坚持了2天了,并且已经阅读了至少4篇关于插入排序的不同文章,但仍然一无所获。

您的第二个函数(您在第二块代码中定义的函数)很好…但是你没有正确地理解你的返回参数。是吗

sorted_arr, counter = insertionSort(arr, n)
要获取
计数器

您的第二个函数(您在第二个代码块中定义的函数)是可以的…但是您没有正确捕获返回参数。是否执行

sorted_arr, counter = insertionSort(arr, n)

要获取
计数器

有几个问题。要解决索引错误,请将
n
设置为精确的
arr
长度。然后,要修复计数器错误,请将计数器移回本地范围(无论如何它的声明)。最后,您永远不会解压缩计数器和
arr
,因此也不会更新

arr = [1,9,6,5,4,3,5,2] #arr = open("rosalind_ins.txt").read().split(' ')
n = min(8, len(arr))
counter = 0

def insertionSort(arr, n):
    counter = 0
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
            counter += 1
        arr[j+1] = key
    return arr, counter

arr, counter = insertionSort(arr, n)
print(counter)
print(arr)

并取目标
n
len(arr)
的最小值,以避免索引超出数组的末尾。

存在一些问题。要解决索引错误,请将
n
设置为精确的
arr
长度。然后,要修复计数器错误,请将计数器移回本地范围(其声明).最后,您从未打开计数器和
arr
,因此也不会更新

arr = [1,9,6,5,4,3,5,2] #arr = open("rosalind_ins.txt").read().split(' ')
n = min(8, len(arr))
counter = 0

def insertionSort(arr, n):
    counter = 0
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
            counter += 1
        arr[j+1] = key
    return arr, counter

arr, counter = insertionSort(arr, n)
print(counter)
print(arr)

并取目标
n
len(arr)
的最小值,以避免索引超出数组的末尾。

因此,我尝试了一些建议的解决方案,结果是

arr = [open("rosalind_ins.txt").read().split(' ')]
n = len(arr)
counter = 0

def insertionSort(arr, n):
    counter = 0
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
            counter = counter + 1
        arr[j+1] = key
    return arr, counter

sorted_arr, counter = insertionSort(arr, n)
print(counter)
print(sorted_arr)
arr=[open(“rosalind_ins.txt”).read().split(“”)]
n=长度(arr)
计数器=0
def插入端口(arr,n):
计数器=0
#穿过1到len(arr)
对于范围(1,n)内的i:
key=arr[i]
#移动arr[0..i-1]的元素,这些元素是
#大于键,到前面一个位置
#他们目前的处境如何
j=i-1
当j>=0且键

它只是重新打印输入的列表,计数器为0,因此,我尝试了一些建议的解决方案,结果是

arr = [open("rosalind_ins.txt").read().split(' ')]
n = len(arr)
counter = 0

def insertionSort(arr, n):
    counter = 0
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
            counter = counter + 1
        arr[j+1] = key
    return arr, counter

sorted_arr, counter = insertionSort(arr, n)
print(counter)
print(sorted_arr)
arr=[open(“rosalind_ins.txt”).read().split(“”)]
n=长度(arr)
计数器=0
def插入端口(arr,n):
计数器=0
#穿过1到len(arr)
对于范围(1,n)内的i:
key=arr[i]
#移动arr[0..i-1]的元素,这些元素是
#大于键,到前面一个位置
#他们目前的处境如何
j=i-1
当j>=0且键

它只是重新打印出输入的列表,0的计数器只是想发布这个问题的解决方案。谢谢Dillon Davis,mortysporty

arr = open("rosalind_ins.txt").read().split(' ')
n = 811
counter = 0

def insertionSort(arr, n):
    counter = 0
    arr = [int(i) for i in arr if isinstance(i, str)]
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
            counter = counter + 1
        arr[j+1] = key
    return arr, counter

arr, counter = insertionSort(arr, n)
print(counter)
print(arr)
arr=open(“rosalind_ins.txt”).read().split(“”)
n=811
计数器=0
def插入端口(arr,n):
计数器=0
arr=[int(i)表示arr中的i,如果存在(i,str)]
#穿过1到len(arr)
对于范围(1,n)内的i:
key=arr[i]
#移动arr[0..i-1]的元素,这些元素是
#大于键,到前面一个位置
#他们目前的处境如何
j=i-1
当j>=0且键
好的,我只是想发布这个问题的解决方案。谢谢狄龙·戴维斯,mortysporty

arr = open("rosalind_ins.txt").read().split(' ')
n = 811
counter = 0

def insertionSort(arr, n):
    counter = 0
    arr = [int(i) for i in arr if isinstance(i, str)]
    # Traverse through 1 to len(arr)
    for i in range(1, n):
        key = arr[i]
        #move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
            counter = counter + 1
        arr[j+1] = key
    return arr, counter

arr, counter = insertionSort(arr, n)
print(counter)
print(arr)
arr=open(“rosalind_ins.txt”).read().split(“”)
n=811
计数器=0
def插入端口(arr,n):
计数器=0
arr=[int(i)表示arr中的i,如果存在(i,str)]
#穿过1到len(arr)
对于范围(1,n)内的i:
key=arr[i]
#移动arr[0..i-1]的元素,这些元素是
#大于键,到前面一个位置
#他们目前的处境如何
j=i-1
当j>=0且键
计数器
是在全局范围内定义的,但在函数中没有
全局
关键字,它认为
计数器+=1
正在递增一个本地
计数器
,其中没有任何计数器被声明。将
计数器=0
移动到函数中,或将
全局计数器
放在函数顶部。如果可能的话,最好是前者。另外,我认为您的
n
是错误的。设置
n=len(arr)
。在第一个版本中,使用计数器返回排序后的数组和计数器,然后尝试打印出计数器:执行将永远不会到达该打印(计数器)。此外,函数返回两个值,但当您调用它时,返回y