20180812 - 《算法导论》-1

以下是个人的默写内容,如有错误,请留言指正,谢谢。

1、冒泡排序:bubbleSort
从前往后,两两比较,将大的放到后面。长度递减循环。
稳定、原址、O(n2)

2、插入排序:insertSort
从前往后,最新的那个和旧有的所有进行比较,找到最新在旧有中的位置。
稳定、原址、O(n2)

3、归并排序:mergeSort:
将数组分位两个分区,对每个分区进行插入排序后,再合并。合并方法:A1比B1,A2比B1...将小的放到前面。
不稳定、非原址、O(nlogn)、递归

4、堆排序:heapSort
构造大顶堆:节点node从len/2-1到0循环,node需深度递归遍历整个堆,保证整个堆是完全二叉树。
将堆顶移至末尾,数组长度递减循环。
不稳定,原址、O(nlogn)、递归

5、快速排序:quickSort
选取一个基准数据=数组的最后一个元素。
从前往后的元素和基准比较,小于的在前,大于的在后(递归遍历)。
将基准元素换到小于和大于之间的位置。这个基准的顺序就固定排好了。
数组长度递减循环。
稳定、原址、O(nlogn)、递归

6、最大连续子数组:maxCrossSubArray
数组包含正数和负数。
将数组划分为left-mid-right。
考虑三种情况:只在left取连续累加和最大,包含mid取连续累加和最大,只在right取连续累加和最大。三个情况中选择最大的作为候选。
将数组分区,递归遍历各个分区的累加和情况,将最大的返回。
非比较排序、O(n)、递归

7、方阵相乘:squareMatrixMultiply
两个方阵求乘积。行列相乘再相加=O(n3)。
将方阵A分区为A11/A12/A21/A22四个子集,对子矩阵进行乘积运算后拼装=O(n2.8)
拓展:
strasser方法。
稀疏矩阵相乘的专用方法。

8、计数排序:countSort
需要知道整个数组的取值范围。针对每个取值,统计数组中出现的次数。
按照次数确定数值的位置。需要额外的数组C(记录次数)、数组B(记录排序结果)。
非比较排序、非原址、O(n)、递归数组C

9、基数排序:radixSort
需要是稳定排序,选取快速排序做子集。
数组类似三维的数字排序[329,457,657,839,436],对数据的每一位(个位、十位、百位)分别进行排序。
从个位开始排序(和业务有关)。
非比较排序、原址、O(n)

10、桶排序:bucketSort
数据的分布是[0,1),类似0.11、0.23、0.45、0.47.
需要先将数据分区,将0.X相同的分到一个桶里面,桶的个数确定,10个桶(0.0-0.9)。
针对桶内按0.X.X继续分区。递归。
非比较排序、原址、O(n)

11、最大值+最小值:maxMin
通常做法:每个数值,先和最大比,再和最小比,这样每个数比较2次。
改进:两个数值绑定一起比较,则每个数比较1.5次(每两个数比较3次,不确定?)
提升运算效率。

12、随机选择排序:rendomizedSelect
类似快速排序,区别是选择某一侧(和选择的目标有关)的分区递归。

13、选择排序:select
默认选择5个元素。分区:划分n/5个区,每个区5个元素。
插入排序,选择每个区的中位数。
对每个区的中位数进行排序(根据选择的目标,选择某一侧的一批中位数)
递归某一侧的分区数据,找到目标。

14、数据结构:插入删除=链表、查找=散列表。
动态、对象指针:栈stack、队列queue、链表link(插入+删除更优,next、prev、head、tail、sentinel(哨兵))。
非对象指针=数组表示以上的动态结构。数组下标的用法。
直接寻址:查找的时间复杂度O(n),数组太大时效率低。
散列表hashTable:查找的时间复杂度O(1)。数据均匀散列存储,近似数据对应大不同的散列值。但是会有冲突。
冲突解决:
a、冲突后,以链表的形式存储多个hash值。
b、冲突后,开放寻址:继续选取另一个散列函数来转存。双重散列保证数据一定不会冲突。(如何保证?)
散列类型:
a、除法散列。
b、乘法散列。
c、双重散列。

你可能感兴趣的:(算法实现)