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

章节内容

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

内存的工作原理

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

数组与链表

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

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

选择排序

算法思路:

  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. 在同一数组中,所有元素的类型都必须相同。
原文地址:https://www.cnblogs.com/prelude1214/p/13584000.html