这几天断断续续,讲了很多种基本的排序算法。
学习的奇妙之处在于,即使是再简单不过的问题,总有人思解出新奇的巧妙来。
譬如除了以前介绍的排序算法外,还有基于树结构的堆排序算法,基于有序数表合并的合并排序算法等等等。
既然排序算法纷繁多态,那么究竟哪一种算法算是“好的”呢?这就涉及到对算法的评价。公欲搞评价,必先放指标。一般来说,可以从以下几个方面判断排序算法的优劣。
1.系统的资源占用(空间复杂度):包括内存的占用和其他资源的占用。一个“好”的排序算法必然会尽量少的占用系统的内存。在上述介绍的方法中,大部分只需要使用一个元素的存储单位。用于交换数据(在这些算法中,数据都是一个个进行排序的,故在内存中实际一次只对一个元素进行操作)。而合并算法需要使用与原始数组一样长的n个元素的存储单位,用来保存多遍的合并操作。
2.计算的复杂度(时间复杂度):对于n个元素的数组,从最差和平均两个视角去考查他们的复杂度。
|
此外,关于排序法还有一个稳定性的概念,稳定性是指维持原始记录里面相等数据相对次序的性质。这也就是说,在原始的数据里面有· · ·,d1,d2,· · ·,在排序之后还为· · ·,d1,d2,· · ·(即d1和d2的相对次序保持不变),那么这个算法就具有稳定性。在上述的算法里,冒泡、插入和合并算法,都是稳定性算法,而选择,shell,快速和堆排序都不是稳定性算法。
可见,在没有给具体情境的条件下,谈算法的优劣那就是耍流氓。单n很小时,以上所说的什么时间复杂度,空间复杂度,统统不要考虑嘛,哪个掌握的数量不会出错就写哪个,毕竟你开心就好。笑。
顺便公布一下,昨天的答案。
counter1 = 1
counter2 = 0
反正我是做错了,翻车了啊!其实这样问题主要是涉及到JAM(Java 虚拟机)中类的初始化过程,关于这点尚在学习阶段,学成再来填这个坑。
今天的题目是,以下程序会输出什么呢?
public class Test extends Father{
private String name=”test”;
public static void main(String[] args){
Test test = new Test();
System.out.println(test.getName());
}
}
class Father{
private String name=”father”;
public String getName() {
return name;
}
}