算法导论学习笔记(2)
课时3 分治法:
二分查找算法:在一个已排序的数组中找到一个数
1:分:把这个数和数组的中间元素相比较
2:治:在一个字数组中递归
3:合并
T(n)=T(n/2)+Θ(1)=Θ(lgn);
连乘问题:n个x相乘
1 偶数:x^n=x^(n/2)*x^(n/2)
2 奇数:x^n=x^(n-1/2)*x^(n-1/2)*x
T(n)=T(n/2)+Θ(1)=Θ(lgn);
课时4
快速排序:
选取一个数,划分数组,让前面的比它小,后面的比它大
最坏的情况:划分过程产生的两个区域分别包含n-1个元素和1个0元素的时候,如果算法每一次递归调用中都出现了这种不对称划分,T(n)=Θ(n^2)。
最佳的情况:最平衡的划分,T(n)=Ο(nlgn)
快速排序的随机化版本:
不是采用最后一个数作为主元,而是从子数组A[p..r]中随机选择一个元素,即将最后一位和随机的元素交换,这样期望在平均情况下,对输入数组的划分能够比较对称。
快速排序算法期望的运行时间为Ο(nlgn)。
堆排序:
最大堆:除了根以外的每个结点,其结点的值至多是和父结点的值一样大,最大元素存放在根结点
最小堆:除了根以外的每个结点,其结点的值至多是和父结点的值一样小,最小元素存放在根结点
堆排序先把输入数组构成一个最大堆,然后取出最大的元素,也就是根结点,然后重复构建最大堆,取最大值,直到还剩2个数。
算法效率:Θ(nlgn)
课时5 线性时间排序
任意一个比较排序算法在最坏的情况下,都需要做Ω(nlgn)次的比较
堆排序和合并排序都是渐进最优的比较排序算法。(快速排序也是比较好的)
计数排序:
1 算出每个数有几个,用一个临时存储区记录
2 算出每个数在目标数组的下标
3 排序
Θ(n)
一个重要性质就是它的稳定性,具有相同值的元素在输出数组中的相对次序与它们在输入数组中的次序相同,即在输入数组中先出现的,在输出数组中也位于前面。
基数排序:
假设长度为n的数组A中,每个元素都有d位数字,以最低位为一组,排序,一直排到最高位,按位排序要稳定,(依靠计数排序)
定理:给定n个d位数,每一个数位可以取k种可能的值,基数排序算法能以Θ(d(n+k))的时间正确地对这些数进行排序
桶排序:
把区间[0,1)划分成n个相同大小的子区间或称桶,然后把n个输入数分布到各个桶中,然后对桶中的数进行排序,再合并。
桶排序的期望运行时间为Θ(n)

浙公网安备 33010602011771号