zoukankan      html  css  js  c++  java
  • 2选择排序

    1. 内存的工作远离

    假设你去超市,需要将东西寄存到柜子。你有2个包需要寄存,因此要了2个格子去存放。
    计算机就像是许多格子的集合体,每个格子都有地址。
    需要将数据存储到内存时,用户请求计算机提供存储空间,计算机给用户一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它们的差别很重要。

    2. 数组和链表

    数组意味着所有待办事项在内存种都是相连的(紧靠在一起)。
    比如一个数组,有3个成员变量(大众、丰田、本田)。
    要添加第4个待办事项,但后面的那个格子存放这别人的东西。在这种情况下,你需要请求计算机重新分配一块可容纳4个待办事项的内存,再将所有待办事项都移到那里。
    解决方法:即便当前只有3个待办事项,也请计算机提供10个位置,以便需要添加待办事项。它存在如下两个缺点:

    • 你额外请求的位置可能根本用不上,这将浪费内存。你没有使用,别人也用不了
    • 待办事项超过10个后,你还得转移。

    因此,这种权宜之计虽然不错,但绝非完美的解决方案。对于这种问题,可使用链表来解决。

    2.1 链表

    链表中的元素可存储在内存的任何地方。链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。插入元素时,根本就不需要移动元素。只要有足够的内存空间,就能为链表分配内存。

    2.2 数组

    在读取链表的最后一个元素时,你不能直接读取,因为不知道它所处的地址,必须先访问第1个元素,获取第2个元素的地址;再访问第2个元素,获取第3个元素的地址...直到最后一个。需要读取所有元素时,链表的效率很高;如果需要跳跃访问,链表的效率很低。
    数组根据索引去获取元素。因此需要随机的读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。

    2.3 在中间插入

    链表:插入元素很简单,只需修改它前面的那个元素指向的地址。
    数组:则必须将后面的元素都向后移。如果没有足够的空间,可能还得将整个数组复制到其他地方。
    因此,需要在中间插入元素时,链表是个更好的选择。

    2.4 删除

    删除元素也是一样
    链表:只需修改前一个元素指向的地址。
    数组:删除元素后,后面的元素都向前移。

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

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

    访问方式有随机访问和顺序访问。
    顺序访问意味着从第一个元素开始逐个的读取元素。链表只能顺序访问。
    随机访问意味着可直接跳到第10个元素。

    3. 选择排序

    假设有个列表,需要从大到小进行排序
    [78, 65, 34, 27, 6, 45]
    方法:遍历这个列表,找出最大的值,并将这个值加入到一个新列表中;继续这样做,找出第2大的值...直到原列表为空,得到一个有序列表。

    3.1 计算时间

    O(n)意味着查看列表中的每个元素一次,因此n个元素的总时间为o(n2)

    3.2 大O表示法中的常数

    随着排序的进行,每次需要检查的元素数逐渐减少。既然如此,运行时间怎么还是O(n2)呢?
    第一次检查n个元素,第二次检查n-1个元素...最后一次检查1个元素,(n+n-1+...+2+1)=(n+1)*n/2,忽略常数,视为O(n2)

    选择排序是一种灵巧的算法,但速度不是很快。快速排序是一种更快的排序算法,其运行时间为O(n log n)

    3.3 选择排序示例代码

    def findMax(arr):
        #获取数组中最大的值
        max = arr[0]
        max_index = 0
        for i in range(len(arr)):
            if(arr[i]>max):
                max = arr[i]
                max_index= i
    
        return max_index
    
    def selectionSort(arr):
        #遍历数组,将数组中最大的值加入从原数组中删除并加入到新数组
        newArr= []
        for i in range(len(arr)):
            max = findMax(arr)
            newArr.append((arr.pop(max)))
        return newArr
    print(selectionSort([78, 65, 34, 27, 6, 45]))    #[78, 65, 45, 34, 27, 6]
    
  • 相关阅读:
    phonegap 捕获图片,音频,视屏 api capture
    phonegap的照相机 API
    phonegap 的指南针 api Compass
    PhoneGap Geolocation结合百度地图api获取地理位置api
    PhoneGap Geolocation 获取地理位置 api
    PhoneGap实现重力感应
    PhoneGap模仿微信摇一摇功能
    75-扩展GCD-时间复杂度
    15- 1 << k 时的益出
    6-画图
  • 原文地址:https://www.cnblogs.com/csj2018/p/12046357.html
Copyright © 2011-2022 走看看