zoukankan      html  css  js  c++  java
  • 算法--冒泡排序

    算法关键点:

      无序区

      有序区

    冒泡排序

    列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数……(升序,大的放后面)

     代码关键点:

    • 无序区 (红色表示有序去,白色表示无序区)

    python代码实现:

    li = [9, 2, 3, 4, 5, 6, 7, 8, 1]
    
    
    def foo(li):
        for i in range(len(li) - 1):  # 列表长度-1 趟; i 表示第几趟
            for j in range(len(li) - i - 1):  # 无序区的长度 -1; j 表示当前索引,要和后面的j+1索引比较
                if li[j] > li[j + 1]:
                    li[j], li[j + 1] = li[j + 1], li[j]
    
    
    foo(li)
    print(li)
    # [1, 2, 3, 4, 5, 6, 7, 8, 9]

     时间复杂度:O(n2)

    优化:如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。

    def foo(li):
        for i in range(len(li) - 1):
            exchange = False
            for j in range(len(li) - i - 1):
                if li[j] > li[j + 1]:  # 循环一遍,前面的值都小于后面,说明已经排好了,就执行下面的return
                    li[j], li[j + 1] = li[j + 1], li[j]
                    exchange = True
            if not exchange:
                return

    Python的速度 10的7次方 (千万)

    C语言大约是Python的10倍

    100002次运算次数 Python用时10秒左右, C用1秒左右

  • 相关阅读:
    圣战 [奇环, 树上差分]
    花火之声不闻于耳 [线段树]
    SP2878 KNIGHTS
    P5300 [GXOI/GZOI2019]与或和 [单调栈]
    Speike [线段树, 动态规划]
    Jerry [动态规划]
    JSON对象
    正则书写
    flex布局实践
    数组对象的深拷贝与浅拷贝
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/12891193.html
Copyright © 2011-2022 走看看