有序是一种特殊的状态,而维持状态是有代价的。
本书介绍了7种数据结构(链表、数组、栈、队列、哈希表、堆、二叉查找树),6种排序算法(冒泡、插入、选择、堆、归并、快速),图算法,以及加密算法等知识。以图配文、不含代码实现的写作方式,使内容变得生动形象、易于理解。
虽然这些排序算法不是很实用,但是却很经典。我个人认为:排序就是找到游标,从而划分出已排序、待排序部分。
下面的算法是:侏儒排序与插入排序,似是而非的两个算法。为了让两个算法看起来像,就有了不“整洁”的插入排序代码。在插入排序中,for语句维持着的变量i与while语句中的变量i是不同的。
def gnome_sort(seq):
i = 0
while i < len(seq):
if i > 0 and seq[i - 1] > seq[i]:
seq[i - 1], seq[i] = seq[i], seq[i - 1]
i -= 1
else:
i += 1
def insert_sort(seq):
for i in range(len(seq)):
while i > 0 and seq[i-1] > seq[i]:
seq[i - 1], seq[i] = seq[i], seq[i - 1]
i -= 1
文摘
堆是一种图的树形结构,被用于实现“优先队列”,可以自由添加数据,但取出数据时要从最小值开始按顺序取出。堆中的每个结点最多有两个子结点,结点的排列顺序为从上到下,同一行里则为从左到右。在堆中存储数据时必须遵守这样一条规则:子结点必定大于父结点。
二叉查找树有两个性质:第一,每个结点的值均大于其左子树上任意一个结点的值;第二,每个结点的值均小于其右子树上任意一个结点的值。
不存在负数权重时,更适合使用效率较高的狄克斯特拉算法,而存在负数权重时,应该使用可以得到正确答案的贝尔曼-福特算法。