常见的算法的可视动画演示效果可在这个网址查看:
visualising data structures and algorithms through animation - VisuAlgo
基本的冒泡排序算法很简单,假定有10个数需要排序,那么就需要跑10轮,在每一轮里,都依次进相邻的两个数比较,如果右边的数比左边的数小,那么就将两个数交换位置,否则就不交换。在每一轮里,需要比较9次,才能将10个数都比较完成。这样比较的效果,就是每一轮,依次将最大、次大、次次大的数放到了右边,效果就像冒泡一样,所以叫冒泡排序。
效果如下:
示例代码如下:
import java.util.Arrays;
public class TestBubbleSort {
public static void main(String[] args) {
int[] values = {3,1,6,8,9,0,7,4,5,2};
System.out.println("原始排序是:"+ Arrays.toString(values));
bubbleSort(values);
}
public static void bubbleSort(int[] values){
int temp;
for (int i=0; i<values.length; i++){
for (int j=0;j < values.length-1-i;j++){
if (values[j] > values[j+1]){
temp = values[j];
values[j] = values[j+1];
values[j+1] = temp;
}
}
System.out.println("第"+(i+1)+"轮排序"+Arrays.toString(values));
}
}
}
运行结果:
优化的冒泡排序算法,是增加一个判断条件,即如果在一轮排序后,发现没有发生过一次交换,那么下一轮就不再进行了,在上图中,也就是进行到第7轮时,就可以发现在第7轮,没有发生过一次相邻的数据交换,因此,就在这这一轮结束排序。
示例代码:
import java.util.Arrays;
public class TestBubbleSort {
public static void main(String[] args) {
int[] values = {3,1,6,8,9,0,7,4,5,2};
System.out.println("原始排序是:"+ Arrays.toString(values));
bubbleSort(values);
}
public static void bubbleSort(int[] values){
int temp;
for (int i=0; i<values.length; i++){
boolean flag = true; //在最外层循环定义一个用于判断是否发生交换的标志变量
for (int j=0;j < values.length-1-i;j++){
if (values[j] > values[j+1]){
temp = values[j];
values[j] = values[j+1];
values[j+1] = temp;
flag = false; //如果发生了交换,就将标志改变
}
}
if(flag){ //如果flag是true,就退出循环
break;
}
System.out.println("第"+(i+1)+"轮排序是"+Arrays.toString(values));
}
}
}
运行结果: