码迷,mamicode.com
首页 > 编程语言 > 详细

Python 常见算法

时间:2020-01-09 23:05:53      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:dom   inf   bubble   range   时间   冒泡   play   原理   close   

一:冒泡排序

时间复杂度:O(n2)

原理:

(1):相邻元素互相比较 如果第一个比第二个大 就交换两者的位置

(2):对每一对邻居做比较 从头走到尾 即走了一趟 最后一位元素即为最大的元素

(3):针对所有的元素重复以上步骤 除了最后一个(因为最后的一位元素已经选出来了 为最大的元素 不需要再比较)

(4):持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,最后数列就是从大到小一次排列

技术图片

技术图片
from cal_time import *
import random

@cal_time
def bubble_sort(li):
    # li 传入的无序列表
    for i in range(len(li) - 1):   # i表示执行多少趟
        for j in range(len(li) - i - 1):   # 第i趟 无序区范围[0, n-i-1]  j表示箭头即倒数第二个位置 0~n-i-2  n代表列表长度
            if li[j] > li[ j + 1]:   # 如果当前位置比邻居位置大
                li[j] , li[j + 1] = li[j+1], li[j]

    return li

li = list(range(100))
random.shuffle(li)
print("pre:", li)
bubble_sort(li)
print("after:", li)
冒泡排序

优化版本:当某一趟走完以后发现并没有进行数据交换,那么此时的数列已经排列好了,没有必要在进行下去。例如:极端情况下,数列本来已经排序好的,我们只需要走一趟即可完成排序。

技术图片
from cal_time import *
import random

@cal_time
def bubble_sort(li):
    # li 传入的无序列表
    for i in range(len(li) - 1):   # i表示执行多少趟
        exchange = False  # 交换标志
        for j in range(len(li) - i - 1):   # 第i趟 无序区范围[0, n-i-1]  j表示箭头即倒数第二个位置 0~n-i-2 因为顾头不顾尾 因此范围为len - i - 1 n代表列表长度
            if li[j] > li[ j + 1]:   # 如果当前位置比邻居位置大
                li[j] , li[j + 1] = li[j+1], li[j]
                exchange = True  # 改变标志
        if not exchange:
            return 
    return li

li = list(range(100))
random.shuffle(li)
print("pre:", li)
bubble_sort(li)
print("after:", li)
优化版冒泡排序

Python 常见算法

标签:dom   inf   bubble   range   时间   冒泡   play   原理   close   

原文地址:https://www.cnblogs.com/SR-Program/p/12173732.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!