如何在没有for循环的情况下实现冒泡排序?

时间:2019-04-01 08:29:03

标签: python algorithm loops

我想知道如何在不使用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循环,如何解决呢?

3 个答案:

答案 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]