3.27《算法图解》笔记——Chapter 2 Choose Sorting

算法图解笔记——Chapter 2 Sorting
Author: Seven Zou
Email: zoushiqi0404@gmail.com
Language: Python2.7


2 排序算法

  • 学习两种最基本的数据结构——数组和链表,它们无处不在。第一章使用了数组,其他章也几乎都将用到数组。数组是个重要的主题,但在有些情况下,使用链表比使用数组更合适。
  • 学习排序算法、快速排序算法。排序算法包含冒泡排序,选择排序,快速排序,归并排序,堆排序等。选择排序是包括快速排序的基石。快速排序是一种重要的算法。

2.1数组和链表

数组:元素是在一起的。可以理解为将数据按照固定顺序排列好,且同一数组内所有元素都必须相同(都为int、double等)。
链表:元素是分开的。可以理解为每个元素都存储了下一个元素的地址,从而使得一系列随机的地址串在一起。
e.g.如果想在地址中插入一个元素,那么链表不需要移动元素而将地址存储到前一个元素中即可,而数组则需要移动。 在数组中的元素,是带编号的且从0开始。元素的位置(编号)被称为 索引

数组元素123456
索引编号012345
运行时间数组链表
读取 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)

9811
7698
47==>76==>
19n
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 n1n2...21。则平均每次检查 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版。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值