美文网首页我爱编程
代码小工蚁的#《算法图解》#学习笔记-C2

代码小工蚁的#《算法图解》#学习笔记-C2

作者: 代码小工蚁 | 来源:发表于2018-05-26 22:11 被阅读25次

    代码小工蚁的#《算法图解》#学习笔记-C2
    C2 选择排序selection sort

    一、内存的工作原理

    在执行程序时,计算机须先将程序和相关数据读入内存中。
    整个内存被分成若干个存储单元,每个存储单元一般可存放8位二进制数(字节编址)。
    每个单元都有一个唯一的编号来标识(即地址)。[1]
    我们可以将内存想象成一个个连续的抽屉,我们可以存入或取出抽屉中的物品。

    二、数组array和链表linked list

    需要存储多个元素时,可使用数组或链表。
    数组:元素存放在连续的内存空间中。
    链表:元素存放在任意位置的内存空间中,每个元素都存储了下一个元素的地址。

    访问方式:随机访问和顺序访问
    数组支持随机访问。
    链表只能顺序访问。

    数组和链表操作的运行时间

    ---- 数组 链表
    读取 O(1) O(n)
    插入 O(n) O(1)
    删除 O(n) O(1)

    O(n) 线性时间
    O(1) 常量时间
    结论:数组读取快,链表插入、删除快。

    三、选择排序

    选择排序的思路:
    1、n个数据存于列表中
    2、遍历找到一个“最小值”,存到“新列表”中
    3、遍历操作2,直到完成列表中所有元素
    4、新列表即是排序结果(升序)

    选择排序代码片断

    # coding=utf-8
    
    # 选择排序
    def find_smallest(arr):
        smallest = arr[0]
        smallest_index = 0
        for i in range(1, len(arr)):
            if arr[i] < smallest:
                smallest = arr[i]
                smallest_index = i
        return smallest_index
    
    def selection_sort(arr):
        new_arr = []
        for i in range(len(arr)):
            smallest = find_smallest(arr)
            new_arr.append(arr.pop(smallest))
        return new_arr
    if __name__ == '__main__':
        demo_arr = [3, 2, 5, 17, 9, 15, 12]
        print(demo_arr)
        print(selection_sort(demo_arr))
    
    

    选择排序的时间复杂度为:O(n*n),即O(n2)
    选择排序是一个不稳定的排序算法。[2]

    代码分析:
    arr.pop(smallest)
    返回指定索引smallest的元素,并在列表arr中删除此元素。
    new_arr.append()
    将数据追加到列表new_arr末尾

    扩展:python的list.sort()方法与sorted()函数
    list.sort():只适用list排序;返回:无(None),但原列表数据已被排序。
    sorted():适合所有可迭代对象的排序;返回结果是一个新列表,不是在原来的可迭代对象上进行操作。
    简单的示例:

    demo1 = [999, 3, 5, 7, 9]
    demo1.sort()  # 此时无任何显示
    print(demo1)  # 返回:[3, 5, 7, 9, 999] 数据已默认升序排列
    demo1.sort(reverse=True)
    print(demo1)  # 返回:[999, 9, 7, 5, 3] 数据已降序排列
    
    demo2 = {'z':999, 'b':2, 'c':3, 'd':4, 'e':5}
    print(sorted(demo2))  # 返回列表:['b', 'c', 'd', 'e', 'z'] 返回的是字典的键,默认升序
    print(sorted(demo2.items()))  # 返回列表:[('b', 2), ('c', 3), ('d', 4), ('e', 5), ('z', 999)]
    print(sorted(demo2.values(),reverse=True))  # 返回列表:[999, 5, 4, 3, 2] 返回字典的值,降序排列
    
    
    

    sorted()还有更复杂的用法,此处先预留位置,以后再补充。


    [1]百度百科:计算机工作原理
    https://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/7681289?fr=aladdin

    [2]百度百科:选择排序
    https://baike.baidu.com/item/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F

    相关文章

      网友评论

        本文标题:代码小工蚁的#《算法图解》#学习笔记-C2

        本文链接:https://www.haomeiwen.com/subject/kjqejftx.html