gpt4 book ai didi

带有 while 循环的 Python 选择排序返回未改变的数组——为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:44 25 4
gpt4 key购买 nike

我讨厌这样问,但我已经束手无策了。无济于事,因为我正在执行此操作的任务需要 for 循环中包含的 while 循环,而不是嵌套的 for 循环我曾经能够找到的每个例子都被使用过。非常令人沮丧。

下面是代码,其中的注释是我尽我所能理解的,以供自己引用(到目前为止,我还不是一个很好的程序员)。

def selection_sort(arr): 
for indexvalue in range (0, len(arr) - 1): #we want to start with the 0th item in the index for selection sort and end at the second-to-last one,
currentmin = indexvalue #establishes the first variable as our lowest looked at so far. This is something that changes every time we go over the array, looking for the next lowest number
while indexvalue<len(arr):
if arr[indexvalue] < arr[currentmin]: #allows us to find the new lowest value—anything lower than our currently-located minimum should count as our new lowest value
arr[indexvalue], arr[currentmin] = arr[currentmin], arr[indexvalue] #exchanges the two values so that our current lowest value is set one to the left in the array, and the new lowest value one to the right
indexvalue = indexvalue+1 #adds another 1 to our counter so that we can compare the next-indexed items
else: #should occur when we reach the end of our array
break #forcibly ends the while loop, and by extension the function

不太确定发生了什么——尽所能处理的那样它有效,但显然无效。例如,当我运行时:

testlist=[10, 12, 15, 1, 0, 4, 99]
selection_sort(testlist)
print(testlist)

我得到测试列表,没有改变。知道为什么会这样吗?我显然遗漏了一些重要的东西,但我不知道它可能是什么。

编辑:下面新的、改进的代码。不完美,但至少现在可以对某些东西进行排序。这个集合产生了一组数据,这些数据似乎正在用它们的索引位置替换元素;我相当确定它是由第 6 行引起的。但不确定为什么。

def selection_sort(arr): 
for indexvalue in range (0, len(arr) - 1): #we want to start with the 0th item in the index for selection sort and end at the second-to-last one,
currentmin = indexvalue #establishes the first variable as our lowest looked at so far. This is something that changes every time we go over the array, looking for the next lowest number
while indexvalue<len(arr):
if arr[indexvalue] > currentmin: #allows us to find the new lowest value—anything lower than our currently-located minimum should count as our new lowest value
arr[indexvalue], currentmin = currentmin, arr[indexvalue] #exchanges the two values so that our current lowest value is set one to the left in the array, and the new lowest value one to the right
indexvalue = indexvalue+1 #adds another 1 to our counter so that we can compare the next-indexed items
print (arr)
else: #should occur when we reach the end of our array
break #forcibly ends the while loop, and by extension the function

最佳答案

在你的 while 循环开始时你总是比较 arr[currentmin]与自身,因为currentmin == indexvalue当时。由于值永远不会小于自身,因此 else在对列表进行任何更改之前,分支接管并结束 while 循环。
这种情况会在 for 循环的每次迭代中发生,从而为您留下一个未更改的列表。

可能的解决方案来了!

或者,你可以选择 if arr[indexvalue] <= arr[currentmin]:在第 5 行,完全没问题,因为选择排序不一定是稳定的排序算法

你添加一行 indexvalue = indexvalue + 1之前
if arr[indexvalue] < arr[currentmin]:

希望它能有所帮助(而且我没有对所有格式做过度 ^^' )

继续:

既然我们已经解决了这个问题,我们应该看看 if 语句中发生了什么:

当找到一个比最小元素还小的元素时,选择排序只记住这个新索引。
currentmin = indexvalue
应该还没有进行交换。
indexvalue已到达列表末尾,currentmin应该指向最小的尚未排序的元素。

这个最小的元素现在应该与第一个未排序的元素交换,该元素应该在arr[indexvalue]。 .但是既然你用过indexvalue移动到列表的其余部分,程序不知道未排序元素从哪里开始。您需要定义另一个“运行索引”以在 while 循环中使用,用 indexvalue 初始化。在 while 循环的头部之前。

关于带有 while 循环的 Python 选择排序返回未改变的数组——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44348511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com