排序算法可视化系列——篇五“冒泡排序”
冒泡排序
基本思想分析:
冒泡排序是大家都很熟悉的排序算法了,因为用这个排序方法的地方很多,我记得就是计算机基础的老师都讲过,冒泡排序之所以称为这样,是因为它的排序过程很像水泡从水下面到上面的过程。而且在冒泡排序中,我们可以从前往后进行冒泡,也可以从后向前进行冒泡,因为什么呢,因为冒泡排序的思想很简单,就是根据大小交换相邻的两个元素的位置,从后向前(或是从前向后)一直将相邻的两个元素进行交换,直到最大或是最小的元素处于数组的最左边或是最右边(这看你是按哪种大小顺序进行排序)。
算法描述:
//我们假设对于简单的整型数组进行排序,而且按照从小到大的顺序进行排列
for(对于整个数组进行循环i=1~n-1){
判断数组已经有序,如果有序则不进行下面的冒泡
for(从位置i元素开始进行冒泡的过程j=i~n-1){
比较相邻元素的大小,如果j大于j+1,则交换两个元素
}
}
算法分析:
我们可以从上面的算法描述中可以看出,冒泡排序在最糟糕的情况下,其时间复杂度为O(n^2),最好的情况是在排序之前数组已经有序,那么其此时的时间复杂度为
O(n),因此冒泡排序在基本有序的数组中其效率还是可观的。
基本的Java语言实现:
/**
* 冒泡排序的基本Java语言实现
* 此处是对于基本的整型数组,按照从小到大的顺序进行排序
*/
public class AlgorithmBubleSort{
public static void bubleSort(int[] array){
boolean isOrdered = true;
int length = array.length;
/**
* 只需要进行n - 1次循环即可,因为后面n - 1个元素有序
* 就说明整个数组已经有序
*/
for(int i = 0; i < length - 1; i++){
/**
* 进行判断是否已经有序
*/
if(isOrdered){
isOrdered = false;
/**
* 进行冒泡的过程
*/
for(int j = 0; j < length - i - 1; j++){
if(array[j] > array[j + 1]){
array[j] += array[j+1];
array[j+1] = array[j] - array[j+1];
array[j] = array[j] - array[j+1];
isOrdered = true;
}//end if
}//end for
}else{
break;
}
}//end for
}//end bubleSort
}
下面是关于冒泡排序的动态演示:
一、排序中。。。。。。
二、排序中。。。。。。
三、排序完成
上面是对冒泡排序的动态演示,下面附源代码: