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])

    

原文地址:https://www.cnblogs.com/Lamfai/p/10756428.html