真正的Java数据结构之冒泡排序算法

 今天之前上网搜Java冒泡排序算法,看到很多都是错误的,所以自己就根据书上实现了一下:

/**
 * 测试冒泡排序
 * @author vincent
 *
 */
public class Maopao{
    
    //main方法
    public static void main(String[] args) {
        
        //定义要排序的数组数据
        int[] data = { 1, 5, 3, 54, 61 };
        
        //排序前输出
        printArray(data);
        
        //进行排序
        int[] data1 = bubbleSort(data);
        
        //排序后输出
        printArray(data1);
    }

    
    
    /**
     * <h4>冒泡排序(降序)</h4>
     * 
     * @param array
     *            要进行排序的int数组
     */
    public static int[] bubbleSort(int[] array) {

        //定义临时变量,负责交换时的临时数据
        int temp;
        
        //这一层循环是指每次都进行重新的、从头的判断交换排序
        for (int i = 0 ; i < array.length; i++) {
            
            //这里for的条件【j < array.length - 1】这样做是为了防止下面的判断出现[数组越界异常]!
            for (int j = 0; j < array.length - 1; j++) {
                
                //如果数组元素的当前(从第一个开始)值小于后一个元素的值
                if (array[j] > array[j + 1]) {
                    
                    //进行数据交换
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    
                }
                
            }
            
        }
        
        return array;
    }


    /**
     * 输出数组元素
     * @param obj 要输出的数组
     */
    public static void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "  ");
        }
        System.out.println();
    }


}

程序运行流程,

未排序时:

[1, 5, 3, 54, 61]

第一次排序结果:

[5, 3, 54, 61, 1]

第二次排序结果:

[5, 54, 61, 3, 1]

第三次排序结果:

[54 , 61, 5, 3, 1]

第四次排序结果:

[61, 54, 5, 3, 1]

温馨提示!这样的遍历并不是最佳的方式,因为每次都从头开始到结尾排序。效率较低(虽然说冒泡本来就效率低),我们可以考虑一下,既然每次都把最小的数据(或者最大的数据)排到最后一个,那么我们完全可以这样做,里面的每次比较只比较除了后一位的前面数据,文字比较绕口,看图看代码:  

图片如下:

 


代码:

/**
     * <h4>修改后的冒泡排序(降序)</h4>
     * 
     * @param array
     *            要进行排序的int数组
     */
    public static int[] bubbleSort(int[] array) {
        
        //定义临时变量,负责交换时的临时数据
        int temp;
        
        //这一层循环是指每次都进行重新的、从头的判断交换排序,但每次都比上一次少一次比较(最后两个不做比较)
        for (int i = array.length - 1 ; i > 0; i--) {
            
            //这里的for的条件[j < i],因为每执行上面的for一次,i都会减1,
            //所以不会进行与第一次排序后的数组的最后一个数据进行比较,
            //比如:当i=3时,j<3,所以下面的这个for只遍历三次,即前面四个数据的两两比较。
            for (int j = 0; j < i; j++) {
                
                //如果数组元素的当前(从第一个开始)值小于后一个元素的值
                if (array[j] < array[j + 1]) {
                    
                    //进行数据交换
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    
                }
                
            }
            
        }
        return array;
    }

 

特别说明:个人学习心得,望各位大神些批评指教!谢谢。

 

posted @ 2017-04-08 18:06  Vincent$  阅读(1478)  评论(0编辑  收藏  举报