zoukankan      html  css  js  c++  java
  • 【算法】选择排序

    内存的工作原理

    需要将数据存储到内存时,请求计算机提供存储空间,计算机返回一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。

    数组和链表

    数组

    • 使用数组意味着所有内容在内存中都是相连的(紧靠在一起的)。
    • 在数组中添加新元素,如果没有了空间,就得移到内存的其他地方,因此添加新元素的速度会很慢。
    优缺点

    优点:

    1. 需要随机读取元素时,数组的效率很高,因为可以迅速找到数组的任何元素

    缺点:

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

    随机访问和顺序访问

    顺序访问:从第一个元素开始逐个地读取元素

    随机访问:可直接跳到第n个元素

    链表

    • 链表中的元素可存储在内存的任何地方。
    • 链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
    • 在链表中添加元素很容易:只需将其放入内存,并将其地址存储到前一个元素中。
    • 只要有足够的内存空间,就能为链表分配内存。

     

    优缺点

    优点:

    1. 链表的优势在插入元素方面;
    2. 需要同时读取所有元素时,链表的效率很高。

    缺点:

    1. 需要读取链表最后一个元素时,不能直接读取。因为不知道它的地址。必须依次访问元素1,元素2,直到最后一个
    2. 跳跃读取元素时,链表的效率很低
    访问方式

    仅支持顺序访问

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

    数组

    链表

    读取

    O(1)

    O(n)

    插入

    O(n)

    O(1)

    删除

    O(n)

    O(1)

    O(n):线性时间

    O(1):常量时间

    中间插入&删除

    中间插入

    需要在中间插入元素时,使用链表要优于数组

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

    删除

    删除元素,使用链表优于数组

    原因:只需修改前一个元素指向的地址即可。而使用数组时,删除元素后,必须将后面的元素都向前移。

    选择排序

    原理

    每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

    时间复杂度

    O(n×n),即O(n2)。

    示例代码

    方法1:

    #将数组元素按从小到大的顺序排列
    
    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 sellectionSort(arr):               #查找序列最小元素,返回并删除,得到新数组重复执行该过程
        arr_new=[]
        for i in range(len(arr)):
            arr_new.append(arr.pop(findsmallest(arr)))
        return arr_new
    
    print(sellectionSort([1,4,2,5,7]))
    

      

    方法2:

    def select_sort(arr):
        for i in range(len(arr)):
            for j in range(i,len(arr)):
                if arr[j]<arr[i]:
                    arr[j],arr[i]=arr[i],arr[j]
        return arr
     
    print(select_sort([1,3,65,2,3,0,33,-1]))
    

      

  • 相关阅读:
    合并链表
    ImportError: cannot import name 'GMM' from 'sklearn.mixture'
    SyntaxError: invalid character in identifier
    在 jupyter notebook 中插入图片
    Atom 换行后删除前面空格,需要按2/4次退格键
    win10输入法InpuMode默认显示中文
    Visual Studio(WindowsSDK.targets(46,5): error MSB8036: 找不到 Windows SDK 版本8.1)
    atom修改注释的字体,字号,颜色
    '__int64' has not been declared
    VMware 打开虚拟机库
  • 原文地址:https://www.cnblogs.com/lilip/p/9505681.html
Copyright © 2011-2022 走看看