助你吃透那些年被捧上天的神秘算法(Python版①)

前言

算法是程序的灵魂,每个程序员,尤其是高手程序员,对算法的掌握应该是如数家珍。算法虽枯燥,但是研究透算法对你的程序功底非常有帮助。那么用Python如何实现主流的算法呢?翻阅各大论坛大牛对Python算法的认识,我自己也粗略的对最基础的Python算法做一下总结。

排序算法-冒泡排序:

排序:不同地点出发最后达到相同的目的,简述为:将一串数据依照特定顺序进行排列的一种算法
助你吃透那些年被捧上天的神秘算法(Python版①)_第1张图片
冒泡排序(Bubble Sort),有时也称为下沉排序,是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻的项目,如果它们的顺序排列错误(如:前大后小)则交换位置。重复传递列表,直到不发生交换为止,这表明列表已排序完成。
冒泡排序分析
给出动态图片,仅供参考哦

按照如上流程,不断前后比较,进行交换(小的靠前,大的后退),分析可得:我们需要进行n-1次冒泡过程,才能将数值排序完成,每次对应的比较次数如下图所示:
助你吃透那些年被捧上天的神秘算法(Python版①)_第2张图片
编辑器中展示:
助你吃透那些年被捧上天的神秘算法(Python版①)_第3张图片
实现冒泡排序代码如下:

"""冒泡排序"""
def bubble_sort(alist):

    n = len(alist)  #列表长度
    # 每次遍历将列表中最大的元素移动到最后,共需要n-1次遍历才能把所有的元素按照从小到大的顺序排列
    for j in range(n - 1):
        # 每一次比较时,都会确定一个新元素,所以下一次需要比较时元素会比上一次减少少一个,所以:n-1-j
        for i in range(0, n - 1 - j):
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i]


list0 = [50, 45, 36, 28, 35, 65, 80, 46, 23]  #值任意给定
bubble_sort(list0)
print(list0)

此时,我们来计算算法的时间复杂度为:
f(n)= n (第一个for循环) * n (第二个for循环)
= O(n^2)

是不是感觉算法其实并不难,不难我们就接着往下走,冲冲冲…
助你吃透那些年被捧上天的神秘算法(Python版①)_第4张图片
算法不难,但是处处是坑,细心的观众可能已经发现上述代码有一个缺陷:如果原列表本身就是从小到大顺序排列的话,代码仍然会继续执行两次循环并遍历所有的元素,时间复杂度仍然为O(n^2)
因此,此代码需要改进,排除掉这种偶然情况!当列表中元素已经是从小到大时,就无需继续执行此代码而只需直接跳过。
优化后的代码如下:

def bubble_sort(alist):
    """冒泡排序"""
    n = len(alist)
    # 每次遍历将列表中最大的元素移动到最后,共需要n-1次遍历才能把所有的元素按照从小到大的顺序排列
    for j in range(n-1):  
        count = 0
        # 每一次比较时,都会确定一个新元素,所以下一次需要比较时元素会比上一次减少少一个,所以:n-1-j
        for i in range(0, n-1-j): 

            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1], alist[i]
                count += 1
        # 如果某次count并未变化,说明这一次元素没有发生位置交换,即说明排序是按照从小到大排列的,不需要发生交换
        if count == 0:  
            return
list0 = [50, 45, 36, 28, 35, 65, 80, 46, 23]  ##值任意给定
bubble_sort(list0) 
print(list0)

运行结果如下:
在这里插入图片描述
冒泡排序时间复杂度
算法最优时间复杂度:O(n)(最好情况:本身给出的列表就是按从小到大的顺序排列,直接跳过全部程序,排序结束。)
算法最坏时间复杂度:O(n^2)
算法稳定性:稳定

你可能感兴趣的:(Python(数据结构)算法)