冒泡排序算法(详解)(JAVA版)

很多时候大多数同学对算法了解,对原理却是一知半解,要他实现一个能跑的算法估计得很费一番脑经,最后出来的代码也是bug百出。下面我有时间将一一用博客形式详解解各个算法一遍。 代码级的讲解。
冒泡算法:
顾名思义,就是把(最大或最小的数据)像泡泡一样从底下冒上去。
比如有一个数组,arr[4] ={ 3,2,1,4}

第一遍冒泡: 
                int pos=0;
               第一步:比较第pos(pos=0)个元素3和第pos+1(pos+1=1)元素2比较,3大于2,,需要网上冒,则2和3交换位置。得2,3,1,4。 同时pos++;
               第二步:此时pos=1,则比较第1个元素和第二个元素 即3和1比较, 3大于1 ,3继续网上冒,3和1交换,得2,1,3,4。
               重复以上步骤。最后得2,1,3,4。

那么次数组最后一个数就是最大的了。

第二遍冒泡:由以上冒泡得到数组最后一个元素已经是最大的了,那么第二遍冒泡只需要在数组arr[0,n-1]重复以上过程即可。

.............

第j遍冒泡:由以上j-1遍冒泡得到的数据arr[j,n]是有序的了,那么我们只需要对arr[0,n-(j-1)]上进行冒泡即可。

循环直到j==n

代码如下:


public static <T> T[] bubbleSort(T[] t, Comparator<T> comparator) {
T temp = null;
int count = 0;
boolean flag = true;
for (int i = 0; i < t.length; i++) {
int k = i;
flag = true;
for (int j = 0; j < t.length - i - 1; j++) {
count++;
if (comparator.compare(t[j], t[j + 1]) > 0) {
temp = t[j];
t[j] = t[j + 1];
t[j + 1] = temp;
flag = false;

}
}

if (flag) {
break;
}

}

return t;
}


上面 红色部分是什么意思呢?  就是flag==true的话表明绿色部分没有执行,也即这一趟冒泡后没有交换任何数据,也即数组已经有序了,那么我们就可以退出循环,不需要再做任何比较了,这对于基本有序的数组来说可以大大降低排序时间。


虽然冒泡排序被认为时间复杂度O(N*N)为最差,但是他也有他的应用场景。。。。

比如数据量小,数组已经基本有序等场合,性能甚至要比快速排序之类的都要快。。。所以不要认为冒泡排序一定就比快速排序慢哦。

你可能感兴趣的:(冒泡排序,排序算法,java排序算法)