算法------冒泡排序算法优化

本文介绍冒泡排序的基础算法及两种优化方法。基础算法通过不断交换相邻元素实现排序,时间复杂度为O(N²)。优化一引入标志位,当某趟排序未发生交换则提前结束,最佳情况可达O(N)。优化二记录最后交换位置减少不必要的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码地址:https://github.com/luoweian/optimalSortingAlgorithm/

通用代码,交换两个数的位置

    public static void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

(1)基础算法,从左到右一直交换,每次排好左右边的一个数,无论数据状况如何时间复杂度都是O(N平方);

    public static void bubbleSort1(int[] arr) {
        for (int end = arr.length - 1; end > 0; end--) {
            for (int i = 0; i < end; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                }
            }
        }
    }

 

(2)设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,

 

说明排序已经完成。数据是有序的时候,时间复杂度是O(N);

    public static void bubbleSort2(int[] arr) {
        boolean flag = true;
        int end = arr.length;
        while (flag) {
            flag = false;
            for (int i = 0; i < end - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                    flag = true;
                }
            }
            end--;
        }
    }

 

(3)再进一步做优化。比如,现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已经有序了,也就是这个位置以后的数据不需要再排序了,于是记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。如果是对于上面的冒泡排序算法2来说,虽然也只排序100次,但是前面的100次排序每次都要对后面的900个数据进行比较,而对于现在的排序算法3,只需要有一次比较后面的900个数据,之后就会设置尾边界,保证后面的900个数据不再被排序。

 

    public static void bubbleSort3(int[] arr){
        boolean flag = true;
        int end = arr.length;
        int record = 0;
        while (flag) {
            flag = false;
            for (int i = 0; i < end - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                    flag = true;
                    record = i;
                }
            }
            end = record;
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值