软件设计师:算法
排序
表格直接背
插入排序 稳定 类似斗地主摸牌
-
将一个待排序的数组分成两部分,前一部分代表是有序序列,后一部分代表未排序序列
-
将第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列
-
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置
-
如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面,直到未排序序列全部扫描完毕为止
序列基本有序,最适合直接插入排序
选择排序 不稳定
- 从待排序的元素中选出最小的元素,存放在起始位置,固定住该最小元素
- 同理取出未固定的元素中的最小元素,存放在起始位置,固定(两个元素交换位置)
- 以此类推,直到全部待排序的数据元素的个数为零。
- 5个元素只需要选择4次,因为最后一个默认为最大的
冒泡排序 稳定
- 比较相邻的元素,如果第一个比第二个大,就交换他们两个
- 对每一对相邻元素做同样的工作,从开始的第一对到结尾的最后一对,这步做完后,最后的元素应该会是最大的数
- 每次过后,需要排序的元素就越来越少,对剩下需要排序的元素重复上面的步骤,直到没有任何一对数字需要比较
希尔排序 上午题没考过 下午题考过1次
时间不够暂时不看了
堆排序 就考过1次
了解 时间不够暂时不看了
归位 构造大顶堆
快速排序 不稳定 分治
归并排序 稳定 分治
先分再合
交叉最多比较的最多
回溯算法 上1次 下2次 N皇后问题
类似走迷宫,分叉口走错路了就返回(回溯)试其它的路
N皇后问题
分治算法 递归求解
二分查找 归并排序 快速排序都是分治思想
复杂问分解成相同/相似的子问题,一直分知道最后的子问题可以简单的直接求解
也有可能划分代价大合并代价小(快排)
动态规划算法 考的最多 求最优解
如求解:0-1背包 最长公共子序列 矩阵连乘
类似于分治法,但是分解的子问题往往不是独立的
用一个表记录所有已解决的子问题答案,在需要时使用,构造一个最优解
0-1背包问题
贪心算法 局部最优
如购物找钱,先给面值大的,再给小的(不一定是最优解)