本文首發於我的博客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