算法图解(选择排序)

前言:程序员

今天是第二篇  学习两种数据结构 --- 数组、链表算法

在这以前你必须明白什么是大O表示法和对数  后面的算法也都会使用大O表示法编程

根据条件选择合适的排序  数组和链表各有优缺点  排序是一种重要的算法数组

数组是快速查找的基石  二分查找就是基于数组排序数据结构

链表修改速度快   若是有其余算法排理解起来会更容易app

选择算法:编程语言

内存的工做原理:学习

  •     就比如超市里的储物柜每一抽屉都才能够存东西并且对应条形码
  •     每个条形码就比如内存地址
  •     计算机的内存就好像是不少抽屉的集合
  •    fe0ffeeb是一个内存单元的地址

须要储存多项数据时有两种基本方式 链表、数组 但他们并不是都适用于全部情形spa

所以知道他们的差异很重要code

数组和链表:

就比如你跟朋友去看电影,找到地方坐下后又来一位朋友,但原来坐的地方没位置了

你须要从新找一个能够容纳四我的的地方  全部人都会移到哪里去

若是又来一位就须要从新找地方

就比如内存空间 有一种作法是提早预留空间这种作法并很差

  • 第一若是添加元素超出预留空间仍是要从新分配内存
  • 第二若是预留空间用不上 纯属浪费内存空间 你不用别人也用不了  再多的内存也架不住程序员的浪费

链表:

    链表中的元素可用存放在内存的任何地方

   每一个元素都存储了下一元素的地址 从而使一些随机的内存串在一块儿

   使用链表时 根本不须要移动元素 好比说6我的一块儿看电影 没有连座

   这里用上网更合适 网吧打LOL 五连坐  对吧   若是没有五连坐 那咱们只好分开来坐

   所以只要有足够的内存空间就能够为链表分配内存

  链表的每个元素记录下一个元素地址 索引你在读取时必须读取到当前元素才能

  获取下一个元素的地址

数组:

  数组每一个元素都有其地址

 

如图一个数组内有5个元素你只要知道其中一个就能够简单推算出其他数组的位置

数组是从0开始的 几乎全部的编程语言的整数都是从0开始的

 

 

 

  • 元素的位置称为索引也叫下标

链表特色:

  • 链表插入数据时不须要考虑位置关系只要有足够的空间就能够插入
  • 链表的插入是随机的其元素没有顺序  因此插入元素时链表是更好的选择
  • 删除元素链表也是更好的选择 由于只需修改一个元素指向的地址便可

数组特色:

  • 数组的支持随机访问和顺序访问 
  • 读取效率很是高 数组是有序的
  • 数组的就该就显得笨拙了 每次修改都要从新分配内存
  • 插入数据时必须将后面的全部元素进行后移

 

 

O(n)表明遍历每个元素一次

有了前面的知识你在选择排序时就能选择适当的储存方式就能够快速高效的排序

 

 选择排序时一种灵巧的算法,其速度不是很快  快速排序是一种更快的排序算法

其运行时间为  O(n log n) 后面讲.....

 

小结:

  1. 极端及内存有了一大堆抽屉
  2. 须要存储多个元素时,可以使用数组或链表
  3. 数组的元素都在一块儿
  4. 链表的元素是分开的,其中每一个元素都储存在一个元素的地址
  5. 数组的读取速度很快
  6. 链表的插入和删除速度很快
  7. 在同一个数组中,全部元素的类型都必须相同(都为int,float等)
  8. 通常而言数组的使用较广泛

 

 

def FindSmallest(arr):
    smallest = arr[0]  # 存储最小的值
    smallest_index = 0  #存储最小元素的索引
    for x in range(1, len(arr)):
        if arr[x] < smallest:
            smallest = arr[x]
            smallest_index = x
    return smallest_index


def SelectionSort(arr):  # 对数值进行排序
    newarr = []
    for x in range(len(arr)):
        smallest = FindSmallest(arr)  # 找出数组中最小的元素
        newarr.append(arr.pop(smallest))  # 将其加入到新的列表
    return newarr


print(SelectionSort([3, 54, 7, 65, 12, 54, 5]))

相关文章
相关标签/搜索