目录
1. 冒泡排序
用一个例子说明一下原理。
这是乱序的,初始的数组{32,4,12,7,22}
32 | 4 | 12 | 7 | 22 |
下面是第一次冒泡(1,2位置的两个数比较 ,调整位置)
4 | 32 | 12 | 7 | 22 |
第二次冒泡 (2,3位置的两个数比较,调整位置)
4 | 12 | 32 | 7 | 22 |
第三次冒泡(3,4位置的两个数比较,调整位置)
4 | 12 | 7 | 32 | 22 |
第四次冒泡(4,5位置的两个数比较,调整位置)
4 | 12 | 7 | 22 | 32 |
到此,只是将最大的值移到了最右边,接下来继续冒泡4次,将第二大的值移到右边倒数第二个位置,一直下去,整个数组就排好了序。
时间复杂度(最坏情况):O(n^2)
代码实现:
public void BubbleSort(int[] array){
int length=array.length;
int nn;
for(int i=0;i<length-1;i++){
for(int j=0;j<length-1-i;j++){
if(array[j+1]<array[j]){ //升序,如果要降序的话就改为>
nn=array[j];
array[j]=array[j+1];
array[j+1]=nn;
}
}
}
}
2. 递归
递归:直接或者间接调用自己的程序叫做递归。
递归调用的次序必须是有限的(即必须有条件来终止递归),将大问题分解为子问题,而且这些子问题的求解方法与原方法相同或极度类似。
比如:求阶乘
public static int factorial(int n){
if(n == 0){
return 1;
}
else{
return n * factorial(n - 1);
}
}
求斐波拉契的第n项。斐波拉契数列是,1,1,2,3,5,。。。 即头两项是1,第三项开始,每一项是前两项的和。
public int fibonacci(int n){
if(n == 0 || n == 1){
return n;
}else{
return fibonacci(n - 1) * fibonacci(n - 2);
}
}
递归的优点:代码简洁易懂,在有些情况下,递归是非常适合的。
递归的缺点:内存消耗高,只需时间较长,因为方法是一层一层地调用下去的,前面的方法要等待后面方法的返回结果才能继续执行,所以只要递归条件没有触发,前面所有的方法都要等着,即占着内存等,当递归条件触发后,才从最后面的方法一层一层的返回上来,最后完成。
因此,能不用递归就不用递归,当然递归层次不多的情况下,还是可以考虑的。