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

    2、选择排序

      2.1 内存的工作原理

        需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。

        需要存储多项数据时,有两种基本方式——数组和链表。

      2.2 链表

        链表的元素科存储在内存的任何地方。

        链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。

        在链表中添加元素很容易:只需将其放入内存,并将其地址存储到前一个元素中。

        使用链表时,根本不需要移动元素。链表的优势在插入元素方面,只要有足够的内存空间,就能为链表分配内存。

      2.3 数组

        需要随即地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。在链表中,元素并非靠在一起的,你无法迅速计算出第五个元素的内存地址,而必须先访问第一个元素以获取第二个元素的地址,再访问第二个元素以获取第三个元素的地址,以此类推。

      2.4 术语

        数组的元素带编号,编号从0而不是从1开始。

        元素的位置称为索引。

        数组的读取时间为:,插入时间为:

        链表的读取时间为:,插入时间为:

        :线性时间

        :常量时间

      2.5 在中间插入

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

      2.6 删除

        如果你要删除元素,链表也是更好的选择,因为只需修改前一个元素指向的地址即可。而使用数组时,删除元素后,必须将后面的元素都向前移。

        不同于插入,删除元素总能成功。如果内存中没有足够的空间,插入操作可能失败,但在任何情况下都能将元素删除。

        

        需要指出的是,仅当能够立即访问要删除的元素时,删除操作的运行时间才为。通常我们都记录了链表的第一个元素和最后一个元素,因此删除这些元素时运行时间为

        数组用得很多,因为它支持随机访问。

        顺序访问:意味着从第一个元素开始逐个地读取元素。链表只能顺序访问:要读取链表的第十个元素,得先读取前九个元素,并沿链接找到第十个元素。

        随机访问意味着可直接跳到第十个元素。

        数组的读取速度更快,这是因为它们支持随机访问。很多情况都要求能够随机访问。因此数组用得很多。

        数组和链表还被用来实现其他数据结构。

      2.6 选择排序

        大O表示法省略诸如1/2这样的常数,因此简单地写作或者

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

        代码清单2-1 选择排序

    # -*- coding: utf-8 -*-
    # 用于找出数组中最小元素的函数
    def findSmallest(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 selectionSort(arr):
        newArr = []
        for i in range(len(arr)):
            # 找出数组中最小的元素,并将其加入到新数组中
            smallest = findSmallest(arr)
            newArr.append(arr.pop(smallest))
        return newArr
    
    
    print selectionSort([5, 3, 6, 2, 10])

        

  • 相关阅读:
    MySQL之触发器
    MySQL之视图
    MySQL之多表查询(笛卡尔积查询、内连接、外连接(左外连接,右外连接)、union、union all )
    MySQL之子查询
    MySQL之关键字
    mysql之内连接,外连接(左连接,右连接),union,union all的区别
    mysql之魔鬼训练营
    MySQL之innodb和myisam的区别
    springmvc+spring+mybatis 项目配置
    Css3 伪元素
  • 原文地址:https://www.cnblogs.com/Lamfai/p/10756428.html
Copyright © 2011-2022 走看看