使用 'for' 与 'while' 进行快速排序



'''

def swap_elements(my_list, index1, index2):
my_list[index1], my_list[index2] = my_list[index2], my_list[index1]
def partition(my_list, start, end):
p = end
b= start
for i in range(len(my_list)):
if my_list[i] < my_list[p]:
swap_elements(my_list, i, b)
b += 1
swap_elements(my_list, b, p)
p = b
return p

def quicksort(my_list, start, end):
if end - start < 1:
return my_list
else: 
p = partition(my_list, start, end)
partition(my_list, start, p-1)
partition(my_list, p+1, end)
'''

当我因为第二个函数"partition"而使用此代码时,会出现IndexError:list索引超出范围。然而,当我像这样更改"分区"代码时''

def partition(my_list, start, end):
i = start
b = start
p = end
while i < p:
if my_list[i] <= my_list[p]:
swap_elements(my_list, i, b)
b += 1
i += 1
swap_elements(my_list, b, p)
p = b
return p

"它有效。我不知道暂时和暂时之间的区别。有人知道答案吗?

这与forwhile循环的选择无关,因为它们在功能上是相同的。这一切都与边界有关。您已经为for循环编写了以下行:

for i in range(len(my_list)):

而您已经为while循环编写了以下行:

i = start
b = start
p = end
while i < p:

你可以看到这些线条不一样。在for循环中,在整个数组的长度上进行迭代,而在while循环中,从给定的边界进行迭代。因此,您应该修改for循环的范围,如下所示:

p = end
b= start
for i in range(start, p):

此外,您应该像这样修改quicksort方法,以确保它运行:

p = partition(my_list, start, end)
quicksort(my_list, start, p-1)
quicksort(my_list, p+1, end)
return my_list

最新更新