这条线在排序算法中意味着什么(气泡示例)
What does this line mean in Sorting Algo(Bubble example)
def bubbleSort(array):
swapped = False
for i in range(len(array)-1,0,-1):
print(i)
for j in range(i):
print(j)
if array[j]>array[j+1]:
array[j], array[j+1] = array[j+1], array[j]
swapped= True
if swapped:
swapped=False
else:
break
print(array)
bubbleSort([5, 2, 1, 3])
我应该如何解释这一行:for i in range(len(array)-1,0,-1)
?我对 0
和 -1
参数的需求感到特别困惑。
那一行发生了一些事情,我将给出简化的解释(我假设这段代码是用 Python 编写的)。
首先,for i in iterable
将循环遍历 iterable
,这意味着 for 循环中的代码将重复与 iterable
中的元素一样多的次数,这可能是一个数组,一个列表,一个字符串等,每次循环时,i
将是 iterable
的下一个元素,从第一个开始。比如for i in [1, 2, 3]
会循环3次;第一次,i
将等于 1;第二个,2,等等
接下来,range
函数生成一个可迭代的数字范围,例如 0-9。使用单个参数,range
将产生从 0 到该数字的范围,但在它之前停止,例如range(5)
会给你 [0, 1, 2, 3, 4]
。因此,如果您要使用 for i in range(5)
,您的代码将重复 5 次,其中 i 从 0 递增到 4。
有两个参数时,范围将从第一个开始并在第二个之前停止,第二个必须大于第一个。例如,range(3, 8)
会给你 [3, 4, 5, 6, 7]
。然而,range(8, 3)
将不起作用,因为起始编号大于终止编号。这意味着你不能只用 2 个参数倒数。
range
的第三个可选参数是步长;您希望数字每步增加 或减少 多少。例如,range(0, 10, 2)
将为您提供输出 [0, 2, 4, 6, 8]
,在 10 之前停止。您可以在此处通过将 step 参数设置为负数来生成递减范围。 range(10, 0, -2)
会给你 [10, 8, 6, 4, 2]
,在第二个参数之前再次停止,range(10, 0, -1)
会给你完整的 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
最后,len(iterable)
函数会给出你给它的任何长度,或者列表中包含的项目数。例如 len("Hello!")
会给你 6,而 len([1, 2, 3, 4, 5])
会给你 5.
将这些放在一起,行 for i in range(len(array)-1, 0, -1)
将执行以下操作:
- 代码将重复列表中的项目的次数,其中 i 取列表中的每个值
- 该列表是一个数字范围
- 范围的起始编号是
array
的长度减去一个
- 范围的末尾是 0
- 范围递减,步长为-1
因此,如果 array
是 ["fish", "banana", "pineapple", "onion"]
,len(array)
将是 return 4,所以你将得到 for i in range(3, 0, -1)
,它将循环 3 次,其中 i
是 3,然后是 2,然后是 1。
这是一个相当简单的答案,所以我建议您查找一些有关您不理解的功能的教程。
def bubbleSort(array):
swapped = False
for i in range(len(array)-1,0,-1):
print(i)
for j in range(i):
print(j)
if array[j]>array[j+1]:
array[j], array[j+1] = array[j+1], array[j]
swapped= True
if swapped:
swapped=False
else:
break
print(array)
bubbleSort([5, 2, 1, 3])
我应该如何解释这一行:for i in range(len(array)-1,0,-1)
?我对 0
和 -1
参数的需求感到特别困惑。
那一行发生了一些事情,我将给出简化的解释(我假设这段代码是用 Python 编写的)。
首先,for i in iterable
将循环遍历 iterable
,这意味着 for 循环中的代码将重复与 iterable
中的元素一样多的次数,这可能是一个数组,一个列表,一个字符串等,每次循环时,i
将是 iterable
的下一个元素,从第一个开始。比如for i in [1, 2, 3]
会循环3次;第一次,i
将等于 1;第二个,2,等等
接下来,range
函数生成一个可迭代的数字范围,例如 0-9。使用单个参数,range
将产生从 0 到该数字的范围,但在它之前停止,例如range(5)
会给你 [0, 1, 2, 3, 4]
。因此,如果您要使用 for i in range(5)
,您的代码将重复 5 次,其中 i 从 0 递增到 4。
有两个参数时,范围将从第一个开始并在第二个之前停止,第二个必须大于第一个。例如,range(3, 8)
会给你 [3, 4, 5, 6, 7]
。然而,range(8, 3)
将不起作用,因为起始编号大于终止编号。这意味着你不能只用 2 个参数倒数。
range
的第三个可选参数是步长;您希望数字每步增加 或减少 多少。例如,range(0, 10, 2)
将为您提供输出 [0, 2, 4, 6, 8]
,在 10 之前停止。您可以在此处通过将 step 参数设置为负数来生成递减范围。 range(10, 0, -2)
会给你 [10, 8, 6, 4, 2]
,在第二个参数之前再次停止,range(10, 0, -1)
会给你完整的 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
最后,len(iterable)
函数会给出你给它的任何长度,或者列表中包含的项目数。例如 len("Hello!")
会给你 6,而 len([1, 2, 3, 4, 5])
会给你 5.
将这些放在一起,行 for i in range(len(array)-1, 0, -1)
将执行以下操作:
- 代码将重复列表中的项目的次数,其中 i 取列表中的每个值
- 该列表是一个数字范围
- 范围的起始编号是
array
的长度减去一个 - 范围的末尾是 0
- 范围递减,步长为-1
因此,如果 array
是 ["fish", "banana", "pineapple", "onion"]
,len(array)
将是 return 4,所以你将得到 for i in range(3, 0, -1)
,它将循环 3 次,其中 i
是 3,然后是 2,然后是 1。
这是一个相当简单的答案,所以我建议您查找一些有关您不理解的功能的教程。