冒泡排序

冒泡排序是一种基础的交换排序算法,简单的冒泡排序代码比较简单

public static void sort(int[] arr){
        int changeNum = 0;   //轮询次数
        int compareNum = 0;  //比较元素次数
        int swapNum = 0;     //交换元素次数
        for(int i =0; i<arr.length-1; i++){
            changeNum++;
            for(int j=0; j<arr.length-1-i; j++){
                compareNum++;
                int tem=0;
                if(arr[j]>arr[j+1]){
                    swapNum++;
                    tem = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tem;
                }
            }
        }
        System.out.println("changeNum:" + changeNum + ", compareNum:" + compareNum+", swapNum:"+swapNum);
    }

优化1:原始的算法在数列已经是有序的情况下,仍会执行循环。那么如果能判断数列已经有序,就可以提前结束。

public static void sortOptimize1(int[] arr){
        int changeNum = 0;   //轮询次数
        int compareNum = 0;  //比较元素次数
        int swapNum = 0;     //交换元素次数
        for (int i = 0; i < arr.length - 1; i++) {
            changeNum++;
            boolean isSorted = true;  //有序标记
            for (int j = 0; j<arr.length-1-i; j++) {
                int temp = 0;
                compareNum++;
                if (arr[j] > arr[j + 1]) {
                    swapNum ++;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    isSorted = false;
                }
            }
            if (isSorted) {
                break;
            }
        }
        System.out.println("changeNum:" + changeNum + ", compareNum:" + compareNum+", swapNum:"+swapNum);
    }

优化2:在排序过程中,右边有序的元素会越来越多,但是每一次轮询排序还是会比较已经有序的区域,因此可以记录右边的有序区域范围,轮询到有序区域时就提前结束本次轮询。

public static void sortOptimize2(int[] arr){
        int changeNum = 0;   //轮询次数
        int compareNum = 0;  //比较元素次数
        int swapNum = 0;     //交换元素次数
        int sortBorder = arr.length -1; //无序的边界
        for (int i = 0; i < arr.length - 1; i++) {
            changeNum++;
            boolean isSorted = true;  //有序标记
            int sortBorderTem = sortBorder;
            for (int j = 0; j < sortBorder; j++) {
                int temp = 0;
                compareNum++;
                if (arr[j] > arr[j + 1]) {
                    swapNum ++;
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    isSorted = false;
                    sortBorderTem = j;
                }
            }
            //循环结束后,记录无序的边界
            sortBorder=sortBorderTem;
            if (isSorted) {
                break;
            }
        }
        System.out.println("changeNum:" + changeNum + ", compareNum:" + compareNum+", swapNum:"+swapNum);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值