2 回答
TA贡献1836条经验 获得超5个赞
反向问题出现在插入函数的 foror 循环中,当您的循环达到这些值时,它会启动反向模式
def insert(B, k, hi, A):
# when hi=5
for x in range(hi-1, -1, -1):
# x = 4
# here B[4] is 10 and k=1 so B[4] <= 1 is False
# you program does not execute the inside of if
# instead it jumps to B = append(B, A[x]) where A[4] == 10
# and the this loop goes in reverse mode from 4 to 0
# when x = 3
# B[x] = 8 so 8 is not less or equal of k where k = 1
# so it jumps again to B = append(B, A[x]) where A[x] = A[3] = 8
# so it append 8
# and so on
# when this loop is finished your list will look like [1,4,6,8,10,10,8,6,4,2]
# the 1 gets added when the loop is finished at B[0] = k
# and then rest of the outputs are result of the loop inside the insertionSort func
if B[x] <= k:
B = append(B, k)
return B
B = append(B, A[x])
B[0] = k
return B
这是一个解决方案:
def insertionSort(A):
copy_sort = A.copy()
for i in range(1, len(copy_sort)):
item = copy_sort[i]
j = i - 1
while j >= 0 and copy_sort[j] > item:
copy_sort[j + 1] = copy_sort[j]
j -= 1
copy_sort[j + 1] = item
return copy_sort
your_array = [2,4,6,8,10,1,3,5,7,9]
sorted = insertionSort(your_array)
print(your_array)
print(sorted)
TA贡献1816条经验 获得超6个赞
您需要在纸上制定算法,然后将这些步骤转换为 Python 代码。您实施的内容令人费解且不正确。
最重要的insert
是,对于它需要的信息以及它应该如何完成它的工作感到非常困惑。从您的代码中我可以看出,您希望此例程将给定值k
插入到 list 中的适当位置B
。出于某种原因,您还传入了列表A
和该列表中的值的位置,这两者都不适用。
你的日常工作很奇怪。从末尾开始B
(使用i
而不是B
自身),代码检查 B 的元素;每次在列表中找到一个小于新值的值时,它都会将新值附加到B
. 无论进行何种比较,它都会附加A
to的相应元素B
。您没有将元素插入到正确的位置。
重写这段代码。从最少的必要信息开始:
def insert(arr, new_val): # insert new_val into the list arr
现在,您的函数需要执行两个步骤:
找到合适的位置
new_val
使用插入该位置的值创建一个新列表。
你返回那个新列表。
你能从那里继续吗?
添加回答
举报