linewon 2022-03-22 00:59 采纳率: 0%
浏览 125

为什么我的冒泡排序这么慢?java

问题遇到的现象和发生背景

测试一下几个排序算法的实际性能,相同的10万个随机数的排序,冒泡要14s,交换要2.7s,直插只要800ms。
同样时间复杂度的算法,怎么跑起来差这么多。
debug看了,每一趟冒泡过程也很正常。

问题相关代码,请勿粘贴截图

下面是冒泡排序的代码。

@Slf4j
public class BubbleSort {
    @Test
    public void test() {
        int[] arr = new int[]{8, 6, 18, 5, 4, 11, 1, 9, 2, 3, 7, 15};
        log.info("init: {}", Arrays.toString(arr));
        bubbleSort(arr);
        log.info("result: {}", Arrays.toString(arr));
    }

    public void bubbleSort(int[] arr) {
        if (arr == null)
            return;

        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = true;
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;

                    // 3次亦或还不如直接拷贝
//                    arr[j] = arr[j] ^ arr[j + 1];
//                    arr[j + 1] = arr[j] ^ arr[j + 1];
//                    arr[j] = arr[j] ^ arr[j + 1];
                    flag = false;
                }
            }
//            log.debug("i={}, arr: {}", i, Arrays.toString(arr));
            if (flag) // 已经有序
                break;
        }
    }
}
运行结果及报错内容

下面是运行代码中的简单测试用例,并打印的结果

00:50:47.782 [main] INFO cn.line.sort.BubbleSort - init: [8, 6, 18, 5, 4, 11, 1, 9, 2, 3, 7, 15], len=12
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=1, arr: [6, 8, 5, 4, 11, 1, 9, 2, 3, 7, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=2, arr: [6, 5, 4, 8, 1, 9, 2, 3, 7, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=3, arr: [5, 4, 6, 1, 8, 2, 3, 7, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=4, arr: [4, 5, 1, 6, 2, 3, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=5, arr: [4, 1, 5, 2, 3, 6, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=6, arr: [1, 4, 2, 3, 5, 6, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=7, arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=8, arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 18]
00:50:47.786 [main] INFO cn.line.sort.BubbleSort - result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 18]

结果看起来挺正常的,每次把当前未排序部分最大的数,冒泡到数组的末端。

我的解答思路和尝试过的方法

调试、打印,看看网友的代码。

我想要达到的结果

是冒泡就是这么慢,还是我代码有问题?
有没有一个参考数据?

  • 写回答

2条回答 默认 最新

  • 关注

    冒泡排序就是比较慢的,冒泡排序数组元素交换的次数比较多,比其它排序方式慢是正常的
    你不要每次都取arr.length的值,用变量保存arr.length的值,循环中用变量来控制循环次数
    另外把变量声明都放在循环外比较好

            int len = arr.length,i,j,tmp;
            boolean flag;
            for (i = 0; i < len - 1; i++) {
                flag = true;
                for (j = 0; j < len - 1 - i; j++) {
                    if (arr[j] > arr[j + 1]) {
                        tmp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = tmp;
    
                        // 3次亦或还不如直接拷贝
    //                    arr[j] = arr[j] ^ arr[j + 1];
    //                    arr[j + 1] = arr[j] ^ arr[j + 1];
    //                    arr[j] = arr[j] ^ arr[j + 1];
                        flag = false;
                    }
                }
    //            log.debug("i={}, arr: {}", i, Arrays.toString(arr));
                if (flag) // 已经有序
                    break;
            }
    

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月22日

悬赏问题

  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
  • ¥30 乘子法解约束最优化问题的matlab代码文件,最好有matlab代码文件
  • ¥15 写论文,需要数据支撑
  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥15 基于图神经网络的COVID-19药物筛选研究
  • ¥30 软件自定义无线电该怎样使用