算法图解笔记——Chapter 2 Sorting
Author: Seven Zou
Email: zoushiqi0404@gmail.com
Language: Python2.7
2 排序算法
- 学习两种最基本的数据结构——数组和链表,它们无处不在。第一章使用了数组,其他章也几乎都将用到数组。数组是个重要的主题,但在有些情况下,使用链表比使用数组更合适。
- 学习排序算法、快速排序算法。排序算法包含冒泡排序,选择排序,快速排序,归并排序,堆排序等。选择排序是包括快速排序的基石。快速排序是一种重要的算法。
2.1数组和链表
数组:元素是在一起的。可以理解为将数据按照固定顺序排列好,且同一数组内所有元素都必须相同(都为int、double等)。
链表:元素是分开的。可以理解为每个元素都存储了下一个元素的地址,从而使得一系列随机的地址串在一起。
e.g.如果想在地址中插入一个元素,那么链表不需要移动元素而将地址存储到前一个元素中即可,而数组则需要移动。 在数组中的元素,是带编号的且从0开始。元素的位置(编号)被称为 索引。
数组元素 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
索引编号 | 0 | 1 | 2 | 3 | 4 | 5 |
运行时间 | 数组 | 链表 |
---|---|---|
读取 | O ( 1 ) {O(1)} O(1) | O ( n ) {O(n)} O(n) |
插入 | O ( n ) {O(n)} O(n) | O ( 1 ) {O(1)} O(1) |
删除 | O ( n ) {O(n)} O(n) | O ( 1 ) {O(1)} O(1) |
Remark: O ( 1 ) {O(1)} O(1)表示常量时间; O ( n ) {O(n)} O(n)表示线性时间。
2.2选择排序
假如要对一个列表中(1-n)数从小到大排列则共有n次,所以需要的总时间为 O ( n × n ) O(n \times n) O(n×n),即 O ( n 2 ) O(n^2) O(n2)。
98 | 1 | 1 | ||
---|---|---|---|---|
76 | … | 98 | … | … |
47 | ==> | 76 | ==> | … |
… | … | … | … | … |
19 | … | … | n | |
O ( n ) O(n) O(n) | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) |
Remark: 对于 O ( n × n ) O(n \times n) O(n×n),第一次检查 n n n个元素,但之后依次递减, n − 1 、 n − 2 、 . . . 、 2 、 1 n-1、n-2、...、2、1 n−1、n−2、...、2、1。则平均每次检查 1 / 2 × n 1/2 \times n 1/2×n,则运行时间实际为 O ( n × 1 / 2 × n ) O(n \times 1/2 \times n) O(n×1/2×n),在大O表示法中省略 1/2 这样的常数,故写作 O ( n × n ) O(n \times n) O(n×n)( O ( n 2 ) O(n^2) O(n2))。
附Case的Code:
# -*- 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])
2.3快速排序
快速排序是一种更快的排序算法,其运行时间为
O
(
n
l
o
g
n
)
O(nlog^n)
O(nlogn)。
在学习快速排序算法之前,需了解 递归 概念,则明天再进行补充学习,待更。
Reference
[美]Aditya Bhargava/袁国忠, 算法图解, 北京:人民邮电出版社, 2017.3.
Note: 开始学习使用Github来管理自己的Code了。
附Github地址: https://github.com/shiqi0404/Algorithm_Diagram,其中包括笔记、Code还有书本pdf版。