N 個元素數據需要進行 N - 1 趟排序,第 i 趟排序,需要對元素數據做兩兩比較 N - i 次,每趟排序完成之后,剩余較大的元素(升序)或較小的元素(降序)將冒到
數組最末端,此后,該項元素就此排定,不需要再移動。
基類:BaseSort.java

package sort;

/**
* -----------------------------------------
* @文件: BaseSort.java
* @作者: fancy
* @郵箱: fancydeepin@yeah.net
* @時間: 2012-7-18
* @描述: 基類
* -----------------------------------------
*/

public class BaseSort {

protected final static int ASC = 1; // 升序
protected final static int DESC = 0; // 降序
//交換i1、i2下標指向的值

public void swap(Object[] array, int i1, int i2){
Object tempObj;
tempObj = array[i1];
array[i1] = array[i2];
array[i2] = tempObj;
tempObj = null;
}
//打印輸出數組元素

public void print(Object[] array){

for(Object obj : array){
System.out.print(obj + " ");
}
System.out.println();
}
}

冒泡排序:BubbleSort.java

package sort;

/**
* -----------------------------------------
* @文件: BubbleSort.java
* @作者: fancy
* @郵箱: fancydeepin@yeah.net
* @時間: 2012-7-18
* @描述: 冒泡排序
* -----------------------------------------
*/

public class BubbleSort extends BaseSort{


/**
* @方法名: bubbleSort
* @參數名: array 排序對象
* @參數名: order 排序順序
* @描述語: 單向冒泡排序,復雜度:O(n^2)
*/

public void bubbleSort(Object[] array, int order){
int length = array.length;

if(order == ASC){ //升序排序

for(int i = 0, j; i < length - 1; i++){ //N個數需N-1趟,每趟完成之后,較大元素將冒到數組最末端

for(j = 0; j < length - 1 - i; j++){ //每趟需要比較N-i次比較

if(Double.parseDouble(array[j].toString()) > Double.parseDouble(array[j + 1].toString())){
swap(array, j, j + 1);
}
}
print(array);
}

}else if(order == DESC){ //降序排序

for(int i = 0, j; i < length - 1; i++){ //N個數需N-1趟,每趟完成之后,較小元素將冒到數組最末端

for(j = 0; j < length - 1 - i; j++){ //每趟需要比較N-i次

if(Double.parseDouble(array[j].toString()) < Double.parseDouble(array[j + 1].toString())){
swap(array, j, j + 1);
}
}
print(array);
}
}
}
}

解釋一下上面代碼中用粉紅色標記出來的代碼的我的用意,正如你看到的 if(order == ASC) 與 else if(order == DESC) 大括號體里面的代碼幾乎是一模一樣的,
沒錯,我是在 if(order == ASC) 里寫完一次然后將它拷貝到 else if(order == DESC) 體里面的,很明顯,if 和 else if 可以合并到一起寫在第二層 for 循環里面,
這樣一來既減少了代碼量,看起來也比較舒服清晰,我沒有這樣做,是因為 order == ASC 或 order == DESC 只需要判斷一次,而不需要每次進入 第二層 for
循環每次都要判斷,這樣做是無用功,代碼不是寫起來漂亮看起來舒服效率就高;
臨時變量 j,我將 j 的定義放到第一層 for 循環里,我不確定這樣做是不是一種好的做法,很多人也許是習慣性的在 for 里當需要臨時變量時直接定義,或將
臨時變量定義到 for 循環體外面(這種更糟糕),但不管怎么樣,我的看法是,在這里 j 只需要被定義一次,當第一層 for 結束,j 的作用域也將結束,但由于
j 是基本數據類型中的 int,由于數據共享,將 j 定義到 第二層 for 里面也許不是不可,呵,以上純屬個人看法 ... ...
測試類:TestApp.java

package sort;

/**
* -----------------------------------------
* @文件: TestApp.java
* @作者: fancy
* @郵箱: fancydeepin@yeah.net
* @時間: 2012-7-18
* @描述: 測試類
* -----------------------------------------
*/

public class TestApp {


public static void main(String[] args) {

Object[] array = {9,5,7,1,6,3,8,10,4,2};
(new BubbleSort()).bubbleSort(array, BubbleSort.ASC);
}
}

10 個數需要排序 9 趟,每趟結束后,較大的數(這里是升序)將冒到最末端 ---> 后臺打印結果:

5 7 1 6 3 8 9 4 2 10
5 1 6 3 7 8 4 2 9 10
1 5 3 6 7 4 2 8 9 10
1 3 5 6 4 2 7 8 9 10
1 3 5 4 2 6 7 8 9 10
1 3 4 2 5 6 7 8 9 10
1 3 2 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

posted on 2012-07-18 15:25
fancydeepin 閱讀(688)
評論(0) 編輯 收藏