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)
方法4

降序

def reverse_order(l):
    data_list = l
    for i in range(len(data_list) - 1):
        for j in range(i+1, len(l)):
            if data_list[i] < data_list[j]:
                data_list[i],data_list[j] = data_list[j], data_list[i]
    return data_list

if __name__ == "__main__":
    a = [34, 541, 56, 1, 68, 998, 711, 22]
    print(reverse_order(a))

升序

def reverse_order(l):
    data_list = l
    for i in range(len(data_list) - 1):
        for j in range(i+1, len(l)):
            if data_list[i] > data_list[j]:
                data_list[i],data_list[j] = data_list[j], data_list[i]
    return data_list

if __name__ == "__main__":
    a = [34, 541, 56, 1, 68, 998, 711, 22]
    print(reverse_order(a))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值