美文网首页
【排序算法】冒泡排序

【排序算法】冒泡排序

作者: 灰色孤星 | 来源:发表于2018-10-19 15:33 被阅读0次

源代码:https://gitee.com/AgentXiao/DataStructAndAlgorithm

一、排序算法的基础版本

/**
 * @ClassName Bubble01
 * @Description 冒泡排序基础版
 * @Author xwd
 * @Date 2018/10/19 14:58
 */
public class Bubble01 {
    public static void main(String[] args) {
        int[] arr = {6,5,4,3,7,8,9};
        BubbleSort(arr);
    }

    public static void BubbleSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            System.out.println("第"+(i+1)+"次");
            for(int j=0;j<arr.length-1-i;j++){
                System.out.print("第"+(j+1)+"躺:");
                if(arr[j] > arr[j+1]){
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
                System.out.println(Arrays.toString(arr));
            }
        }
    }
}

控制台信息:

第1次
第1躺:[5, 6, 4, 3, 7, 8, 9]
第2躺:[5, 4, 6, 3, 7, 8, 9]
第3躺:[5, 4, 3, 6, 7, 8, 9]
第4躺:[5, 4, 3, 6, 7, 8, 9]
第5躺:[5, 4, 3, 6, 7, 8, 9]
第6躺:[5, 4, 3, 6, 7, 8, 9]
第2次
第1躺:[4, 5, 3, 6, 7, 8, 9]
第2躺:[4, 3, 5, 6, 7, 8, 9]
第3躺:[4, 3, 5, 6, 7, 8, 9]
第4躺:[4, 3, 5, 6, 7, 8, 9]
第5躺:[4, 3, 5, 6, 7, 8, 9]
第3次
第1躺:[3, 4, 5, 6, 7, 8, 9]   //到这里就已经排好序了,下面的次数都属多余的
第2躺:[3, 4, 5, 6, 7, 8, 9]
第3躺:[3, 4, 5, 6, 7, 8, 9]
第4躺:[3, 4, 5, 6, 7, 8, 9]
第4次
第1躺:[3, 4, 5, 6, 7, 8, 9]
第2躺:[3, 4, 5, 6, 7, 8, 9]
第3躺:[3, 4, 5, 6, 7, 8, 9]
第5次
第1躺:[3, 4, 5, 6, 7, 8, 9]
第2躺:[3, 4, 5, 6, 7, 8, 9]
第6次
第1躺:[3, 4, 5, 6, 7, 8, 9]

二、优化版本

/**
 * @ClassName Bubble01
 * @Description 冒泡排序优化版:一旦有序,不再进行下一趟
 * @Author xwd
 * @Date 2018/10/19 14:58
 */
public class Bubble02 {
    public static void main(String[] args) {
        int[] arr = {6,5,4,3,7,8,9};
        BubbleSort(arr);
    }

    public static void BubbleSort(int[] arr){
        boolean isDone = true;//是否完成排序标记
        
        for(int i=0;i<arr.length-1;i++){
            System.out.println("第"+(i+1)+"次");
            isDone = true;//默认这一次不需要进行交换
            for(int j=0;j<arr.length-1-i;j++){
                System.out.print("第"+(j+1)+"躺:");
                if(arr[j] > arr[j+1]){
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                    isDone = false;//假设错误,这一次还是进行了交换
                }
                System.out.println(Arrays.toString(arr));
            }
            if(isDone){ //如果这一次没有,说明已经有序了,跳出循环
                break;
            }
        }
    }
}

控制台信息:很明显去掉了下面的两次循环

第1次
第1躺:[5, 6, 4, 3, 7, 8, 9]
第2躺:[5, 4, 6, 3, 7, 8, 9]
第3躺:[5, 4, 3, 6, 7, 8, 9]
第4躺:[5, 4, 3, 6, 7, 8, 9]
第5躺:[5, 4, 3, 6, 7, 8, 9]
第6躺:[5, 4, 3, 6, 7, 8, 9]
第2次
第1躺:[4, 5, 3, 6, 7, 8, 9]
第2躺:[4, 3, 5, 6, 7, 8, 9]
第3躺:[4, 3, 5, 6, 7, 8, 9]
第4躺:[4, 3, 5, 6, 7, 8, 9]
第5躺:[4, 3, 5, 6, 7, 8, 9]
第3次
第1躺:[3, 4, 5, 6, 7, 8, 9]
第2躺:[3, 4, 5, 6, 7, 8, 9]
第3躺:[3, 4, 5, 6, 7, 8, 9]
第4躺:[3, 4, 5, 6, 7, 8, 9]
第4次
第1躺:[3, 4, 5, 6, 7, 8, 9]
第2躺:[3, 4, 5, 6, 7, 8, 9]
第3躺:[3, 4, 5, 6, 7, 8, 9]

但是还有问题:第4次第1躺就完成了排序,剩下的两次都是多余的。

三、最终版本

/**
 * @ClassName Bubble01
 * @Description 冒泡排序最终版:一旦有序,立刻停止排序
 * @Author xwd
 * @Date 2018/10/19 14:58
 */
public class Bubble03 {
    public static void main(String[] args) {
        int[] arr = {6,5,4,3,7,8,9};
        BubbleSort(arr);
    }

    public static void BubbleSort(int[] arr){
        boolean isDone = true;

        int lastExchangeIndex = 0;//最后一次比较的位置
        int sortBorder = arr.length - 1;//无序书列的边界,每次比较只需要比较到这个位置

        for(int i=0;i<arr.length-1;i++){
            System.out.println("第"+(i+1)+"次");
            isDone = true;
            for(int j=0;j<sortBorder;j++){  //在无序范围内进行交换
                System.out.print("第"+(j+1)+"躺:");
                if(arr[j] > arr[j+1]){
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                    isDone = false;
                    lastExchangeIndex = j;//记录最后一次交换的位置,后面的不需要再交换
                }
                System.out.println(Arrays.toString(arr));
            }
            sortBorder = lastExchangeIndex;//选定交换范围
            if(isDone){ //如果一次交换都没有,说明已经有序了,跳出循环
                break;
            }
        }
    }
}

控制台信息:

第1次
第1躺:[5, 6, 4, 3, 7, 8, 9]
第2躺:[5, 4, 6, 3, 7, 8, 9]
第3躺:[5, 4, 3, 6, 7, 8, 9]
第4躺:[5, 4, 3, 6, 7, 8, 9]
第5躺:[5, 4, 3, 6, 7, 8, 9]
第6躺:[5, 4, 3, 6, 7, 8, 9]
第2次
第1躺:[4, 5, 3, 6, 7, 8, 9]
第2躺:[4, 3, 5, 6, 7, 8, 9]
第3次
第1躺:[3, 4, 5, 6, 7, 8, 9]
第4次

可以看到,一旦排序完成,立刻停止。

相关文章

网友评论

      本文标题:【排序算法】冒泡排序

      本文链接:https://www.haomeiwen.com/subject/rjvyzftx.html