Python版冒泡排序

冒泡排序

冒泡排序算法的核心思想是将一个元素与其他所有元素进行比较,将最大的元素或者最小的元素放到第一或者末尾,然后再进行第二轮比较,直到比较完所有的元素,假设有[9, 5, 7, 3, 8]五个元素,那么两两比较选出最大的元素需要比较4次,如9和5比较选出最大值,然后最大值和7比较选出最大值,一直比较下去,直到最后与8进行比较,就相当于把一段绳子砍成5段需要砍4次的道理是一样的,然后每一次比较完就会少一个元素参与比较,因为在每一次比较中都会把当前最大值给找出来,并上浮(冒泡),那么一个n元素的数组/列表(python中叫列表)就需要重复n-1次。在java/c/c++中我们可能会用for(i=0, i<n, i++),这个方法来完成循环,但是在python和shell中有一个更通俗易懂的语法,那就是for i in range(n),然后i的值会从0递增到n-1,也能实现for(i=0, i<n, i++)的相同效果。

在第二重循环中(size - i - 1)而不是(size - i)是为了防止数组/列表索引溢出,当j为最后一个元素时,j+1就超出数组/列表的大小了

方法1

将两数相加再相减的方式来互换位置

def bubble_sort1(srcArr):
    size = len(srcArr)
    for i in range(size):
        for j in range(size - i - 1):
            if srcArr[j] > srcArr[j+1]:
                srcArr[j] += srcArr[j+1]
                srcArr[j+1] = srcArr[j] - srcArr[j+1]
                srcArr[j] -= srcArr[j+1]
    return srcArr


if __name__ == "__main__":

    arr = [9, 5, 7, 3, 8]
    print("=======================")
    print(arr)
    result1 = bubble_sort1(arr)
    print("=======================")
    print(result1)
方法2

使用python的高级特性来互换位置

def bubble_sort2(srcArr):
    size = len(srcArr)
    for i in range(size):
        for j in range(size-i-1):
            if srcArr[j] > srcArr[j+1]:
                srcArr[j], srcArr[j+1] = srcArr[j+1], srcArr[j]
    return srcArr


if __name__ == "__main__":

    arr = [9, 5, 7, 3, 8]
    print("=======================")
    print(arr)
    result2 = bubble_sort2(arr)
    print("=======================")
    print(result2)

方法3

使用一个中间变量来互换位置

def bubble_sort3(srcArr):
    size = len(srcArr)
    for i in range(size):
        for j in range(size-i-1):
            if srcArr[j] > srcArr[j+1]:
                tmp = srcArr[j]
                srcArr[j] = srcArr[j+1]
                srcArr[j+1] = tmp
    return srcArr


if __name__ == "__main__":

    arr = [9, 5, 7, 3, 8]
    print("=======================")
    print(arr)
    result3 = bubble_sort3(arr)
    print("=======================")
    print(result3)
发布了92 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zZzZzZ__/article/details/104618963