今天第一次写博客,最近正在研究排序算法,就从最简单的冒泡排序算法开始写(有些时候为了面试,冒泡排序算法被问到的几率还是很高的,不仅要求知道原理,还要会写)。
一. 首先看一下百度百科的算法原理。
-
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
3.针对所有的元素重复以上的步骤,除了最后一个。
-
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1. 根据算法原理我们可以写一个比较简单的算法(这个不是最优的,因为可能循环没有结束的时候,就已经有序了)。
public void sort(int[] array){
for(int i=0;i<array.length;i++){
for(int j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
System.out.println(Arrays.toString(array));
}
}
public static void main(String[] args){
int[] array={5,7,9,4,8};
new Bubbling().sort(array);
}
以下是输出结果:
[5, 7, 4, 8, 9]
[5, 4, 7, 8, 9]
[4, 5, 7, 8, 9]
[4, 5, 7, 8, 9]
[4, 5, 7, 8, 9]
其实通过结果不难发现,再循环到第四次的时候,这个结果已经有序了,不用再进行第五次的循环了。
2.我们可以改进我们的算法,让他在已经有序的时候,不在进行循环。
我们可以加一个boolean参数,每次外层循环开始的时候把他设为false,只要这次内循环有移动,就把它设为true,如何内循环没有发生移动,就可以打断外层循环,排序结束。
public void sort(int[] array){
for(int i=0;i<array.length;i++){
isMove=false;
for(int j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
isMove=true;
}
}
if(!isMove){
break;
}
System.out.println(Arrays.toString(array));
}
}
public static void main(String[] args){
int[] array={5,7,9,4,8};
new Bubbling().sort(array);
}
以下是输出结果:
[5, 7, 4, 8, 9]
[5, 4, 7, 8, 9]
[4, 5, 7, 8, 9]