第1章 什么是算法 (已看)
第2章 变量和数组 (已看)
第3章 数据结构 (已看)
第4章 学习算法基础 (已看)
第5章 排序算法 (已看)
第6章 搜索算法 (已看)
第7章 其他算法 (已看)
第8章 算法和计算机 (已看)
第1章 什么是算法
1.1 算法其实就在身边
Q:什么是算法
A:事实上,在数学,计算机等理工科领域,所谓的算法,指的就是"特定问题的解决步骤"
现实生活中也有很多问题的解决方法蕴含了算法的思想.这其中的代表就是菜谱
1.2 算法是人类智慧的结晶
1.3 了解算法对玩游戏有帮助吗?
1.4 算法有两个必要条件
Q:算法的两个必要条件
A: 1.准确性
指的是"输入符合指定条件的值,一定要保证能得到正确的输出"
2.可停止性
保证无论什么样的输入,也一定可以在有限时间内正确地停止
Q:什么叫断言(Assertion)
A:对于算法中的任意一个步骤,输入当前步骤满足条件的值,看看是否能得到当前步骤产生的准确的结果,以此细分并判定
1.5 要特别了解的重要算法
重要的算法
1.专用于数论计算的算法
求解最大公约数的辗转相除法
求解联立方程的高斯消元法
求解定积分近似值的梯形公式
计算质数的埃拉托斯特尼筛法
2.对一组乱序的数据进行升序或者降序排序的算法(sort)
选择排序
冒泡排序
插入排序
希尔排序
归并排序
快速排序
3.在大量数据中找出目标数据的搜索算法(search)
线性搜索(linear search)
二分搜索(binary search)
4.在一个字符串中找到符合特定模式的子串(子字符串)的匹配算法
简单字符串搜索
KMP算法
BM算法
专题1 算法基础之结构化编程思想
Q:什么是结构化编程思想
A:在结构化编程里,所有的处理流程都用以下三种结构的组合来表示
1.顺序结构:以记述的顺序依次进行处理
2.选择结构:根据条件的不同改变处理进程
3.循环结构:在条件成立的情况下,进行一定量的重复处理
第2章 变量和数组
2.1 所谓"数据",就是各种各样的信息
Q:什么是数据
A:数据就是描述各种各样信息的载体.
如果用菜谱来类比算法,那么 食材和调味品(猪肉,洋葱,白糖,盐),用量和时间Q(1/2个,一大勺,文火,5分钟),厨具和餐具(平底锅,锅,盘) 就可以说是数据
可以说,所有的算法都是经由数据和处理的组合来描述的
2.2 数据有不同的类型
基本的数据类型
1.整数
2.浮点数
3.字符
4.字符串
5.布尔值
2.3 最基础的数据是"值"
2.4 装着"值"的盒子叫作"变量"
2.5 要描述算法,变量是不可或缺的
2.6 所谓"代入",指的是把数据赋予变量
2.7 不同的变量有不同的名称
2.8 变量命名要能解释变量装载的数据
2.9 把数据代入变量的赋值语句
2.10 把变量中存储的值代入其他变量
2.11 变量也有数据类型
2.12 保存大量同一数据类型值的"数组"
2.13 数组用"数组名"标记
2.14 数组的元素用"下标"管理
2.15 什么时候需要用到"数组"呢
2.16 "数组"就像储物柜一样
2.17 "二维数组"就像是旅馆里的房间
2.18 二维数组的各个元素用两个下标来管理
2.19 字符串就是字符的连续拼合(数组)
2.20 获取字符串长度的两个方法
专题2 常用变量命名
第3章 数据结构
3.1 为了高效处理大量数据
高效地管理大量数据的构造就称为数据结构.数据结构和"处理过程"在算法中的地位同等重要
3.2 有那些常用的数据结构
有代表性的数据结构
1.数组 把同类数据紧密排列就得到"数组"
2.链表 链表通过像结绳子一样的方式按顺序或者逆序管理前后关联的数据
3.堆栈 堆栈可以用于管理像堆积在桌子上的书本一样的数据.(先进后出)
4.队列 队列对数据的管理方式就像是超市收银台前排的队一样.(先进先出)
5.树
3.3 "堆栈"类似于桌面上堆积的书
3.4 "队列"就像是超市收银台前排着的队列
3.5 "链表"就像用绳子串起来的长串
3.6 只能检索下一个数据的单向链表
单向链表中,每个元素都有以下两种信息:
1.数据
2.指向下一项元素的指针
对于单向链表而言,还有一个信息是非常重要的.这个信息是"指向第一个元素的指针".
3.7 能检索上一个或者下一个数据的双向链表
双向链表的每一个元素都有下面三种信息:
1.数据
2.指向下一项元素的指针
3.指向上一项元素的指针
双向链表包含"指向起始元素的指针(HEAD指针)"和"指向末尾元素的指针(TAIL指针)"
3.8 能快速定位第N个数据的是"数组"
3.9 能快速插入,删除数据的是"链表"
3.10 像钟表一样数据首尾相连的是"环形缓冲区"
3.11 管理有树干,树枝,树叶一样关系的数据的是"树"
3.12 一个父节点对应两个子节点的是"二叉树"
3.13 像笔画的节点和连线组成的数据结构是"图"
专题3 为什么数组的起始下标有时是0,有时又是1?
Q:为什么数组的起始下标有时是0,有时是1?
A:在计算机诞生的初期,最流行的编程语言是Fortran,Pascal,Basic(早期版本),等等.在这些语言的设计中,数组的起始元素索引是1.
不过,接下来流行至今的主流语言,包括C,C++,Java,C#,VisualBasic(BASIC)等都把数组的起始元素索引设计成0
第4章 学习算法基础
4.1 循环处理是算法的基础
算法处理中最常用的就是"循环处理".可以说循环处理是"算法的精髓".
4.2 计算1~N的整数的总和
4.3 使用数组可以高效地处理大量数据
4.4 计算一年的营业额
4.5 求班级考试的总分和平均分
4.6 求最高分
4.7 求最低分
4.8 为考试成绩排名
4.9 求全班学生不同科目考试合计的总分
4.10 求"时分秒"形式的时间差
4.11 交换两个变量值的技巧
4.12 求两个数值的最大公约数
专题4 2038年的时候要留心
第5章 排序算法
5.1 排序是指对多个数据排列顺序
Q:什么叫排序
A:按照某种"事物"的属性数据,为多个"事物"整理顺序的处理就叫作排序(sort).
升序:从小到大排序
降序:从大到小排序
5.2 关于排序算法
较有代表性的排序算法
1.桶排序
准备与待排序数据取值范围大小个数的木桶,利用这些木桶对数据进行保存,排序.
2.选择排序
遍历数据,把数据中的最大值(或者最小值)与起始(或者末尾)数据进行交换
3.交换排序(冒泡排序)
对比相邻的两个数据,根据大小关系调整两个数据的顺序
4.插入排序
把目标数据按照正确的大小排列顺序插入相应的位置中
5.归并排序
把目标数据分割成更小的部分进行排序,更小的部分正确排序之后再合并起来.
6.希尔排序
把目标数据按照一定的个数分成及几个区域进行插入排序
7.快速排序
从目标数据中任意选取一个数据,以这个数据的值为分割点,把目标数据分割为两部分.这样循环操作下去进行排序
5.3 使用"木桶"辅助的"桶排序"
5.4 每次找出一个最小(最大)值的"选择排序"
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public static void SelectionSort(int[] arr) { Action<int,int> Exchange = (int x,int y) => { int z = arr[y]; arr[y] = arr[x]; arr[x] = z; }; int minIndex = 0; for (int i = 0; i < arr.Length; i++) { minIndex = i; for (int j = i; j < arr.Length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } Exchange(minIndex,i); } for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + ","); } }
5.5 像冒泡一样进行相邻数据的交换的"冒泡排序"
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public static void BubbleSort(int[] arr) { Action<int,int> Exchange = (int x,int y) => { int z = arr[y]; arr[y] = arr[x]; arr[x] = z; }; for (int i = 0; i < arr.Length; i++) { for (int j = 0; j < arr.Length - i -1; j++) { if (arr[j] > arr[j + 1]) { Exchange(j, j + 1); } } } }
5.6 向有序数据里正确位置插入数据的"插入排序"
5.7 把几个有序数据合并叫作"归并"
5.8 利用归并进行排序的算法叫做"归并排序"
5.9 改进了排序效率的"希尔排序"
5.10 最快的排序算法"快速排序"
专题5 把2的n阶乘的值记下来吧
第6章 搜索算法
6.1 所谓"搜索",就是从数据集合中找到目标数据
6.2 从头开始按顺序排除的搜索叫作"线性搜索"
6.3 可以进行高速搜索的"二分搜索"
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public static int BinarySearch(int min,int max,int[] arr,int val) { if (val > arr[max] || val < arr[0]) { return -1; } int middle = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(min + max) / 2)); if (arr[middle] == val) { return middle; } else if (arr[middle] < val) { return BinarySearch(middle + 1, max, arr, val); } else if (arr[middle] > val) { return BinarySearch(min, middle - 1, arr, val); } return -1;
6.4 利用哈希表实现高效搜索
6.5 在字符串中搜索部分字符串的"字符串搜索"
6.6 高效搜索字符串的KMP算法
6.7 逆向比较的BM字符串搜索算法
专题6 在关系型数据库中使用到的排序和搜索
第7章 其他算法
7.1 用牛顿法求解高次方程
7.2 用高斯消元法求解方程组
7.3 用梯形面积和来求解定积分的梯形法
7.4 计算质数的埃拉托斯特尼筛法
7.5 执行时调用自身的递归函数
专题7 算法和流程图
第8章 算法和计算机
8.1 计算机的数据是用二进制来表示的
8.2 让二进制数更易于阅读(八进制,十六进制)
8.3 二进制转换成十进制
8.4 十进制转换成二进制
8.5 用二进制表示负整数
8.6 逻辑或:任意一个为"1"则结果为"1"
8.7 逻辑并:同时为"1"则结果为"1"
8.8 "或非":"1"和"0"得到的结果为"1"
8.9 "否定":"1"变为"0","0"变为"1"
8.10 使用德摩根定律可以管理否定范式