算法学习笔记
一般算法:
尾递归
将递归函数调用放到递归单元中的最后一句,在递归参数中完成递归计算,缩小参数数据规模。
这种算法形式上是递归,实际上是在做迭代工作,可以很直观地转换成非递归的迭代算法。
素数筛选法
还是需要双层循环。但引入一个状态数组, 在每次外循环中利用内循环求出外循环变量i的在所求值范围内的所有倍数,加快筛选合数的速度。
汉诺塔
Fibonacci数列
关于互为逆运算且满足交换律的运算规律
定义两个符号#和@,这两个符号互为逆运算,也就是说(x # y) @ y = x。现在依次执行下面三条命令:x <- x # y
y <- x @ y
x <- x @ y
排序算法:
冒泡排序, O(n^2), 单次循环中小数与大数交互位置
选择排序, O(n^2), 单次循环中将最小的数放在最前面
插入排序, O(n^2), 单次循环中从后往前把数插到刚好比它小的数的后一位
希耳排序, O(n^2), 在插入排序的基础上引入一个gap变量,让单次循环中从后往前插数是按gap的值进行“跳越”遍历,每插一次gap递减一次,直到gap被递减为1(如果gap在某次递减后小于1则让gap=1),通常gap的起始值取排序数组的长度的一半,递减量取2.2
快速排序, O(nlogn), 在单次处理中将比某一个成员值小的数移到它的左边,比它大的数移到它的右边,再分别对左边部分和右边部分进行同样逻辑的递归
归并排序, O(nlogn), 将自身不断二分(递归),在每一个二分部分中按序合并前半部分数据和后半部分数据。
图论:
深度优先遍历
广度优先遍历
最小生成树
Dijsktra最短路径算法