為了方便擴展,先引入一個抽象的基礎類:
[html]
- package com.andyidea.algorithms;
-
- /**
- * 排序抽象基礎類
- * @author Andy.Chen
- *
- * @param <T>
- */
- public abstract class Sorter<T extends Comparable<T>> {
-
- public abstract void sort(T[] array,int from,int len);
-
- public final void sort(T[] array){
- sort(array,0,array.length);
- }
-
- protected final void swap(T[] array,int from,int to){
- T tmp = array[from];
- array[from] = array[to];
- array[to] = tmp;
- }
-
- }
【一】
冒泡排序:冒泡排序是一種簡單的排序算法,其平均時間復雜度為O(n
2),它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
冒泡排序算法的具體描述如下:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重復以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
冒泡排序算法源碼如下:
[html]
- package com.andyidea.algorithms;
-
- /**
- * 冒泡排序法
- * @author Andy.Chen
- *
- * @param <T>
- */
- public class BubbleSort<T extends Comparable<T>> extends Sorter<T> {
-
- //是否從右向左排序的標志位
- public static boolean RIGHT = true;
-
- @Override
- public void sort(T[] array, int from, int len) {
- if(RIGHT){
- bubble_right(array, from, len);
- }else{
- bubble_left(array, from, len);
- }
- }
-
- /**
- * 從右向左排序
- * @param array
- * @param from
- * @param len
- */
- public final void bubble_right(T[] array, int from, int len){
- for(int i=from; i<from+len; i++){
- for(int j=from+len-1;j>i;j--){
- if(array[j].compareTo(array[j-1])<0){
- swap(array, j-1, j);
- }
- }
- }
- }
-
- /**
- * 從左向右排序
- * @param array
- * @param from
- * @param len
- */
- public final void bubble_left(T[] array, int from, int len){
- for(int i=from+len-1; i>from;i--){
- for(int j=from;j<i;j++){
- if(array[j].compareTo(array[j+1])>0){
- swap(array,j,j+1);
- }
- }
- }
- }
-
- }
【二】
插入排序:插入排序(Insertion Sort)的算法描述是一種簡單直觀的排序算法,其平均時間復雜度為O(n
2)。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反復把已排序元素逐步向後挪位,為最新元素提供插入空間。
插入排序都采用in-place在數組上實現。具體算法描述如下:
- 從第一個元素開始,該元素可以認為已經被排序
- 取出下一個元素,在已經排序的元素序列中從後向前掃描
- 如果該元素(已排序)大於新元素,將該元素移到下一位置
- 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
- 將新元素插入到該位置中
- 重復步驟2
[html]
- package com.andyidea.algorithms;
-
- /**
- * 插入排序法
- * @author Andy.Chen
- * @param <T>
- *
- */
- public class InsertionSort<T extends Comparable<T>> extends Sorter<T> {
-
- @Override
- public void sort(T[] array, int from, int len) {
- T tmp = null;
- for(int i=from+1;i<from+len;i++){
- tmp = array[i];
- int j = i;
- for( ; j>from; j--){
- if(tmp.compareTo(array[j-1]) < 0){
- array[j] = array[j-1];
- }else{
- break;
- }
- }
- array[j] = tmp;
- }
- }
-
- }