zoukankan      html  css  js  c++  java
  • 在路上---学习篇(一)Python 数据结构和算法 (2) -- 冒泡排序、选择排序、插入排序

    独白:

      第一次接触算法排序, 充满了好奇并且渴望了解其中原理,今天先学习了三种排序的方法,分别是 冒泡排序、选择排序、插入排序。学完以后发现数学知识真的很重要,越牛逼的算法要求知识越多,越精。虽说刚接触有些不容易接受,但我相信凭着不断的主动学习和练习是可以攻克的。最重要的事情 我有兴趣去学习!enjoy!




    一、冒泡排序(英语: Bubble Sort):

    是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

    冒泡排序算法的运作如下:

    • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    • 针对所有的元素重复以上的步骤,除了最后一个。
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    • 时间复杂度

      • 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
      • 最坏时间复杂度:O(n2)
      • 稳定性:稳定

    代码:

    """
    冒泡排序
    时间复杂度O(n*n)
    最优排序:O(n) (遍历一次没发现任何可以交换的元素)
    稳定性 : 稳定
    """
    import time
    import random
    
    
    def new_num(lis):
        """随机生成50个数加入列表中"""
        for i in range(50):
            j = random.randint(0,100000)
            lis.append(j)
    # 开始时间
    first_time = time.time()
    
    
    def bubble_sort_high(list1):
        """升序排列"""
        for j in range(len(list1)-1,0,-1):
            for i in range(j):
                if list1[i] > list1[i+1]:  #  区别
                    list1[i],list1[i+1] = list1[i+1],list1[i]
    
    
    def bubble_sort_low(list2):
        """降序排列"""
        for j in range(len(list2)-1,0,-1):
            for i in range(j):
                if list2[i] < list2[i+1]: #  区别
                    list2[i],list2[i+1] = list2[i+1],list2[i]
    
    
    
    # 空列表
    lis = []
    
    # 随机函数添加到列表中
    new_num(lis)
    
    # 列表排序
    bubble_sort_high(lis)
    print(lis)
    
    # 结束时间
    last_time = time.time()
    
    print("共用时%s" % (last_time - first_time))
    

    二、选择排序

        选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

        选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

    时间复杂度

    • 最优时间复杂度:O(n2)
    • 最坏时间复杂度:O(n2)
    • 稳定性:不稳定(考虑升序每次选择最大的情况)

    代码

    """
    选择排序
    最优时间复杂度:O(n*n)
    不稳定
    """
    
    
    import random
    import  time
    
    
    def selection_sort_high(list):
        """    升序排列   """
        # n 等于列表长度
        n = len(list)
        # 需要n-1次循环 选择操作
        for j in range(n-1):
            # 选出最小下标
            min_index = j
            # 从当前位置 与 其下标后边元素进行比较 选出最小数据
            for i in range(j+1,n):
                if list[i] < list[min_index]:
                    min_index = i
            # 如果选择出的数据不正确,进行交换
            if min_index != j:
                list[j], list[min_index] = list[min_index],list[j]
    
    
    def selection_sort_low(list):
        """  降序排列  """
        n = len(list)
        for j in range(n-1):
            max_index = j
            for i in range(j+1,n):
                if list[i] > list[max_index]:
                    max_index = i
            list[j],list[max_index] = list[max_index], list[j]
    
    
    def freestyle(list):
        """另一种表达式"""
        n = len(list)
        for j in range(n-1,0,-1):
            max_index = j
            for i in range(j):
                if list[i] > list[max_index]:
                    max_index = i
            list[j], list[max_index] = list[max_index],list[j]
    
    
    def new_num(lis):
        """随机生成50个数加入列表中"""
        for i in range(50):
            j = random.randint(0,10000)
            lis.append(j)
    
    first_time = time.time()
    # 空列表
    lis = []
    
    # 随机函数添加到列表中
    new_num(lis)
    
    # 列表排序
    selection_sort_high(lis)
    print(lis)
    
    # 结束时间
    last_time = time.time()
    
    print("共用时%s" % (last_time - first_time))
    

    三、插入排序

    插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间

    时间复杂度

    • 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
    • 最坏时间复杂度:O(n2)
    • 稳定性:稳定

    代码:

    """
    插入排序
    时间复杂度:O(n*n)
    稳定性:稳定
    
    """
    import random
    import time
    
    
    def insert_sort(list):
        n = len(list)
        # 从第二个位置 开始插入 即下标为1
        for j in range(1,n):
            # 从第j个元素开始比较 如果小于前一个元素,则交换位置
            for i in range(j,0,-1):
                if list[i] < list[i-1]:
                    list[i],list[i-1] = list[i-1],list[i]
    
    
    def new_num(lis):
        """随机生成50个数加入列表中"""
        for i in range(50):
            j = random.randint(0,10000)
            lis.append(j)
    
    first_time = time.time()
    # 空列表
    lis = []
    
    # 随机函数添加到列表中
    new_num(lis)
    
    # 列表排序
    insert_sort(lis)
    print(lis)
    
    # 结束时间
    last_time = time.time()
    
    print("共用时%s" % (last_time - first_time))
    
  • 相关阅读:
    Javascript 函数表达式
    当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
    Angularjs 脏值检测
    Angularjs 双向绑定机制解析
    AngularJS 初用总结
    从jquery里的$.ajax()到angularjs的$http
    XSS攻击及防御
    很赞的源码平台
    GET和POST
    [转]xxx.hbm.xml模版
  • 原文地址:https://www.cnblogs.com/Dreamxin/p/7850718.html
Copyright © 2011-2022 走看看