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

代码小工蚁的#《算法图解》#学习笔记-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)