不少時候大多數同窗對算法瞭解,對原理倒是隻知其一;不知其二,要他實現一個能跑的算法估計得很費一番腦經,最後出來的代碼也是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)爲最差,可是他也有他的應用場景。。。。
好比數據量小,數組已經基本有序等場合,性能甚至要比快速排序之類的都要快。。。因此不要認爲冒泡排序必定就比快速排序慢哦。