本文首发于我的博客html
本系列排序包括十大经典排序算法。git
Sort
里面实现了,交换,大小比较等方法。例如交换两个值,直接传入下标就能够了。其余的具体排序的类都继承抽象类Sort
。这样咱们就能专一于算法自己。/*
* 返回值等于0,表明 array[i1] == array[i2]
* 返回值小于0,表明 array[i1] < array[i2]
* 返回值大于0,表明 array[i1] > array[i2]
*/
protected int cmp(int i1, int i2) {
return array[i1].compareTo(array[i2]);
}
protected int cmp(T v1, T v2) {
return v1.compareTo(v2);
}
protected void swap(int i1, int i2) {
T tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
复制代码
冒泡排序的最坏时间复杂度为 O(n^2)。 综上,所以冒泡排序总的平均时间复杂度为O(n^2)。github
public class BubbleSort<T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
for (int end = array.length-1; end>0; end--) {
for (int begin = 1; begin <= end; begin++) {
if (cmp(begin, begin-1)<0) {
//ayyay[begin] 小于 ayyay[begin-1] 就交换
swap(begin, begin-1);
}
}
}
}
}
复制代码
public class BubbleSort1<T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
// TODO Auto-generated method stub
for (int end = array.length-1; end >0; end--) {
boolean isSorted = true; //定义布尔值 isSorted来标记是否有交换
for (int begin = 1; begin <= end; begin++) {
//ayyay[begin] 小于 ayyay[begin-1] 就交换
if (cmp(begin, begin-1)<0) {
swap(begin, begin-1);
isSorted = false;
}
}
if (isSorted) {
//来到这里,说明没有交换过。已是彻底有序的了。提早终止排序
break;
}
}
}
}
复制代码
public class BubbleSort2<T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
// TODO Auto-generated method stub
for (int end = array.length-1; end >0; end--) {
int sortedIndex = 1;
for (int begin = 1; begin <= end; begin++) {
if (cmp(begin, begin-1)<0) {
swap(begin, begin-1);
sortedIndex = begin;
}
}
end = sortedIndex;
}
}
}
复制代码
使用数据源以下算法
Integer[] array = {7, 3, 5, 8, 6, 7, 4, 5,19,30,40,50};bash
结果为:ide
【BubbleSort】 稳定性:true 耗时:0.0s(0ms) 比较次数:66 交换次数:14测试
【BubbleSort1】稳定性:true 耗时:0.001s(1ms) 比较次数:51 交换次数:14优化
【BubbleSort2】稳定性:true 耗时:0.0s(0ms) 比较次数:30 交换次数:14ui
能够明显感受到作了优化以后,比较测试减小了。spa