这一章2个事情:1.决策树。2.三种线性排序。
关于决策树:
1.决策树其实是对前面的堆排序,快排等是最优的比较算法的证明。
2.重要结论,定理8.1证明了任意一个比较算法在最坏情况下都需要做Ω(n lg n)次的比较。
3.这一节其实没什么内容,就是一点基本的概念,以及了解比较算法可以通过转换为决策树这个模型去理解。
关于3种线性排序:
1.计数排序:
基本思想:对每一个输入元素x,确定出小于x的元素个数。
适用范围:适用于输入是由小范围的整数构成的序列。
稳定性:算法是稳定的。
代码如下:
public class count_sort {
public void counting_sort(A,B,k){
int [] C=new int [k+1];
for(int i=0;i<=k;i++)
C[i]=0;
for(int j=1;j<=A.length;j++)
C[A[j]]=C[A[j]]+1;
for(int i=1;i<=k;i++)
C[i]=C[i]+C[i-1];
for(int j=A.length;j>0;j--){
B[C[A[j]]]=A[j];
C[A[j]]=C[A[j]]-1;
}
}
}
关于这个过程,我推荐大家好好自己画图想想,不然肯定弄不懂。
简单说,传入待排数组A[],而C[i]数组则记录<=i的元素个数,B[]数组则是重新要输出的排序数组。
2.基数排序:
基本思想:按组成关键字的各个位的值来实现排序的。
排序方式:
排序方式:LSD 由右向左排; MSD 由左向右排
稳定性:算法是稳定的。
来个图看看这个书上只写了个伪代码,我也就不写了,总之,你先理解这个过程再说。
3.桶排序
桶排序就是刚才的基数变成了n个桶,书上就是把小数点后第一位,相应放进一个桶,然后,在一个桶的元素,连接成一个链表,内部用插入法排序。
具体的实现,可以参照我以前的数据结构的桶排序。