• 《图解算法》读书笔记(二) 选择排序


    章节内容

    • 学习两种最基本的数据结构:数组和链表
    • 学习一种排序算法:选择排序

    内存的工作原理

    在学习数组和链表之前我们需要先了解计算机内存的工作原理,这有助于我们区分这两种数据结构的本质区别,也能更深刻的体会它们的优劣。
    计算机内存的工作原理就像是我们用于寄存东西的抽屉的集合,每个抽屉都有自己的地址。

    数组与链表

    数组在计算机内存中都是相连的,也就是数组每个元素的地址是连续的。
    链表不同于数组,链表中的元素可存储在内存中的任何地方。链表的每个元素都存储了下一个元素的地址,从而使一列表随机的内存地址串在一起。
    链表的优势:

    • 插入元素
    • 删除元素
      数组的优势:
    • 支持随机的读取元素

    选择排序

    算法思路:

    1. 遍历位置0到N的元素,找出最大/最小的元素
    2. 将找到的最大或最小元素与位置0的元素互换
    3. 遍历位置1到N的元素,重复第1和2的步骤,直至最后一个元素
      算法操作次数=n+(n-1)+(n-2)+.....1=n*n/2
      所以时间复杂度为O(n^2)

    示例代码:

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

    小结

    1. 计算机内存犹如一大堆抽屉
    2. 需要存储多个元素时,可使用数组或链表
    3. 数组的元素都在一起
    4. 链表的元素是分开的,其中每个元素都存储了下一个元素的地址
    5. 数组的读取速度很快
    6. 链表的插入和删除速度很快
    7. 在同一数组中,所有元素的类型都必须相同。
  • 相关阅读:
    【sqlite】3.ADO.NET实体数据模型增删改查
    【sqlite】1.Vs2019 ado.net实体模型安装教程
    【sqlite】2.Nuget下载好Sqlite.EF6后出现运行报错处理办法
    WPF-数据绑定:日期时间格式
    Entity Framework Database.SetInitializer的几种参数
    收藏
    Sql时间函数
    SQL中的循环、for循环、游标
    C# DateTime 时间格式
    js setInterval()函数 [倒计时用]
  • 原文地址:https://www.cnblogs.com/prelude1214/p/13584000.html
Copyright © 2020-2023  润新知