• 算法-03-冒泡排序


    '''
    1.排序算法: 也即是把一串无序的数据,依照特定的顺序进行排列的算法.实现从无序到有序的算法
    2.稳定性: 将如下一组元组,按元组中第一个元素大小进行排序进行: (4, 1) (3, 1) (3, 7) (5, 6)
    在这种情况下有可能产生两种结果:
    (1) (3, 1) (3, 7) (4, 1) (5, 6)
    (2) (3, 7) (3, 1) (4, 1) (5, 6)
    第(1)种保持了原来(3, 1) (3, 7)的前后顺序,这种我们称为稳定的.
    第(2)种改变了原有数据这俩元组的前后顺序,我们称这是不稳定的.
    也即若是一种排序能够保证,相等的对比元素,在排序后仍能够保持原有前后顺序的话,那我们就称这种排序算法为稳定的.
    例如此处(3, 1)与(3, 7)中的对比元素都为3,因此实现这两个元组的前后顺序,在排序后不发生改变的第(1)组算法为稳定排序算法.
    3.双层for循环: 注意了这是你的一个思维误区,在双层for循环的情况下,第二个for循环也属于一个独立的for循环,程序会把第二个for循环执行一次从 0-n
    后才执行一次第一个for循环,这也是为什么双层for循环的时间复杂度为 n*n 的原因.
    以后你遇到双层for循环时,就在脑子里执行一次从 0-n 的第二个for循环.
    '''
    '''
    所谓冒泡排序,也即是一个元素一个元素的比较大小,最终实现最大的那个元素排在了末尾.这玩意你应该不需要记笔记,因为只要领悟一遍基本上就能记住.
    '''
    def bubble_sort(alist):
    n = len(alist)
    for j in range(n-1): # 第一个for循环是为了避免重复的从头比到尾,因为经过排序后最后一个数一定是最大的,所以没必要再与最后一个数进行对比.
    count = 0 # 这里创建count能够简化程序的时间复杂度,当原数据已是按规则顺序排序时,可以直接退出,避免无用的再次排序.如[1,2,3,4],这就是一组规则的数据,无需在按大小顺序重新排序.
    for i in range(0, n-1-j): # 第二个for循环是实现元素移动,与对比交换位置的.
    if alist[i] > alist[i+1]: # 注意了没必要去理会当 alist[i+1]>alist[i] 的情况,因为你若是自己推的话能发现,这个循环神奇的就把这种情况给避免了
    alist[i], alist[i+1] = alist[i+1], alist[i]
    count += 1
    if count == 0: # 注意了这里有一个误区,这个if条件是写在第二个for循环后的,因此只有当第二个for循环,循环一次从0到(n-1-j)次之后,
    return # 才会进行count值的判断,也即他是不会出现[1, 2, 4, 3]这种前部分是按顺序,后半部分不按顺序也会退出的情况的.到底为什么,还需要你深刻的理解什么是二重for循环.

    if __name__ == '__main__':
    # li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    li = [1, 2, 3, 5, 4]
    print(li)
    bubble_sort(li)
    print(li)
  • 相关阅读:
    SQL Server 2005 中的同义词
    SQL SERVER 2005中同义词实例
    聚集索引和非聚集索引(整理)
    linux kernel中timer的使用
    linux命令: patch
    win7(64位)php5.5-Apache2.4-mysql5.6环境安装
    tasklet和工作队列
    linux串口编程(c)
    Notepad++中Windows,Unix,Mac三种格式
    centos7/redhat7 将网卡名字改成eth样式的方法
  • 原文地址:https://www.cnblogs.com/gongteng/p/13567550.html
Copyright © 2020-2023  润新知