1、算法的效率
时间复杂度:程序从开始到结束所需要的时间
空间复杂度:算法在运行过程中临时占用存储空间大小的度量
时间渐近复杂度:时间复杂度由最高次幂决定(判断大小技巧:将n=10代入)
O(log2 n):二分查找法
O(n):for(x=1;x<n;x++)
O(n log2 n):堆排序(每次重建堆的时间复杂度是log2 n,n个元素基本上就是O(n log2 n) )
O(n2):for(x=1;x<n;x++){for(j=1;j<n;j++)}
O(2的n次方):判断包含指定子序列,LCS最长公共子系列、钢管切割问题,动态规划自顶向下
O(n!)是最大的,2的n次方次之
2、查找算法
顺序查找:从头到尾比较关键字与表中元素,找到则返回成功,否则返回失败;时间复杂度O(n)
二分查找:先确定有序且顺序的数组的中点位置mind=(low+hign)/2,将待查的k值与mid位置的key比较,若相等返回此位置,否则确定新的查找区间,时间复杂度O(long2 n) [最多查找log2 (n+1) 次 ]
哈希表查找:寻找关键字合集U,最大关键字为m,设计一个函数hash ,它以关键字为自变量,关键字的存储地址为因变量,将关键字映射到一个有限的、地址连续的区域T[0...n-1](n<<m)中,这个区间就称为散列表,散列表查找中使用的转换函数称为散列函数
3、排序算法
稳定排序和不稳定排序
排序方法与类:
插入排序:
1.插入排序:
稳定, 适合基本有序的情况
2.shell排序:
不稳定,插入排序的改进,引入了分组(一般拿奇数作为增量)。先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
选择排序:
1.直接选择排序
不稳定,不管是否有序,都要一一比对。比如我们对 “8,7,1,3,9,2,7,6” 这组n个数据进行选择排序,首先我们先认为第1个数为最小数,然后分别与其他几个数进行比较,如果遇到比其小的就与其交换
2.堆排序
不稳定,每个节点的值都大于或等于其子节点的值,为最大堆;反之为最小堆。一般用数组来表示堆,下标为 i 的结点的父结点下标为(i-1)/2;其左右子结点分别为 (2i + 1)、(2i + 2)。
交换类排序:
1.冒泡排序
稳定,相邻元素之间的比较和交换。不管是否有序,都要一一比对。
2.快速[交换]排序
不稳定,采用分治法,平均性能最好。将原问题分解成若干个规模更小但结构与原问题相似的子问题。一般使用第一个元素作为基准。快速排序的最差情况--基本有序。进行一趟划分的计算时间为O(n)
1.归并排序(也叫合并)
稳定,不管是否有序,都要一一比对。是将两个或两个以上的有序子表合并成一个新的有序表。若将两个有序表合并成一个有序表,则称之为二路合并。
2.基数排序
稳定,适合元素很多而关键字较少的序列。借助关键字排序思想堆单逻辑关键字进行排序的方法(不是基于关键字比较的排序方法)。
4、排序算法策略
若待排序列的记录数目n较小,可采用直接插入和简单选择排序。由于直接插入排序所需的记录移动操作较选择排序多,因而当记录本身信息量大时,用简单选择排序方法较好。
若待排记录按关键字基本有序,适合采用直接插入排序或冒泡排序。
若 N很大且关键字位数较少时,采用基数排序较好。
5、算法策略