随笔-126  评论-247  文章-5  trackbacks-0

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 阅读(682) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: