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) 编辑 收藏