我想知道如何在不使用for
循环的情况下实现冒泡排序,而是在python中使用递归。
这可能吗?我对此感到奇怪
def bubble_sort(list):
for i, num in enumerate(list):
if list[i+1] < num:
list[i] = list[i+1]
list[i+1] = num
bubble_sort(list)
return list
这是可能的,但是如果没有for循环,如何解决呢?
答案 0 :(得分:2)
好吧,可能 ,但效率不高,您可能希望将当前索引和一个布尔标志作为参数传递,该标志指示您是否找到了交换位置要做。
def bubble_sort(list, i, swap_found):
# are we in range 0 <-> len - 2 ?
if (i < len(list) - 1):
# should we swap ?
if list[i + 1] < list[i]:
# you swap
temp = list[i + 1]
list[i + 1] = list[i]
list[i] = temp
swap_found = True
else:
# we are on the last position
# if we had to swap, we will continue to sort
if (swap_found):
swap_found = False
i = -1
else:
# else the list is sorted
return list
return bubble_sort(list, i + 1, swap_found)
print(bubble_sort([4, 7, 1, 4, 2, 9, 42, 69, 0], 0, False))
经过长时间的处理后,输出:
[0, 1, 2, 4, 4, 7, 9, 42, 69]
答案 1 :(得分:0)
您可以使用递归并实现冒泡排序。
这种事情可能会对您有所帮助。
def bubble_sort(inputList):
for i, num in enumerate(inputList):
try:
if inputList[i+1] < num:
inputList[i] = inputList[i+1]
inputList[i+1] = num
bubble_sort(inputList)
except IndexError:
pass
return inputList
答案 2 :(得分:0)
仅使用内置列表属性:
def bub(lst): #the largest element bubbles up
if len(lst) < 2:
return lst
if lst[0] > lst[1]:
lst[0], lst[1] = lst[1], lst[0]
return [lst[0]] + bub(lst[1:])
def bubsort(lst):
if len(lst) < 2:
return lst
bubbled = bub(lst)
#now combine sorted start slice with tail (the largest)
return bubsort(bubbled[:-1]) + [bubbled[-1]]
print(bubsort([7,2,3,1,5]))
>>>[1, 2, 3, 5, 7]