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