我的第一本算法书

有序是一种特殊的状态,而维持状态是有代价的。

本书介绍了7种数据结构(链表、数组、栈、队列、哈希表、堆、二叉查找树),6种排序算法(冒泡、插入、选择、堆、归并、快速),图算法,以及加密算法等知识。以图配文、不含代码实现的写作方式,使内容变得生动形象、易于理解。

虽然这些排序算法不是很实用,但是却很经典。我个人认为:排序就是找到游标,从而划分出已排序、待排序部分。

下面的算法是:侏儒排序插入排序,似是而非的两个算法。为了让两个算法看起来像,就有了不“整洁”的插入排序代码。在插入排序中,for语句维持着的变量iwhile语句中的变量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

文摘

是一种图的树形结构,被用于实现“优先队列”,可以自由添加数据,但取出数据时要从最小值开始按顺序取出。堆中的每个结点最多有两个子结点,结点的排列顺序为从上到下,同一行里则为从左到右。在堆中存储数据时必须遵守这样一条规则:子结点必定大于父结点。

二叉查找树有两个性质:第一,每个结点的值均大于其左子树上任意一个结点的值;第二,每个结点的值均小于其右子树上任意一个结点的值。

不存在负数权重时,更适合使用效率较高的狄克斯特拉算法,而存在负数权重时,应该使用可以得到正确答案的贝尔曼-福特算法