冒泡排序(面试问了怎么优化)

226 阅读1分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

  • 冒泡排序想必工程师都知道,我也没想过面试会问这道题,考察点是冒泡排序优化
  • 防止有小伙伴不了解还是说一下,冒泡排序其实就是将一个无序数组,排列成从小到大的有序数组

二、思路分析

  • 从头到尾两两进行比较
    • 当前元素大于右侧相邻元素时
    • 进行交换
  • 优化
    • 设置一个boolean标记位,每次循环设置为true,如果有交换设置false,无则在最后跳出循环
    • 此时还可以进行二次优化,设置一个无序数组的边界值,减少无用循环比较

三、AC 代码:

public static void sort(int array[]){
    //最后交换的位置
    int lastExchangeIndex = 0;
    //无序数组的边界
    int sortBorder = array.length - 1;
    for(int i = 0; i < array.length - 1; i++){
        //此轮是否有交换
        boolean isSorted = true;
        //循环结束位置为无序数组的边界
        for(int j = 0; j < sortBorder; j++){
            //临时变量
            int tmp = 0;
            //右侧元素大于左侧交换并更新变量
            if(array[j] > array[j + 1]){
                tmp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = tmp;
                isSorted = false;
                lastExchangeIndex = j;
            }
        }
        //更新无序数组边界
        sortBorder = lastExchangeIndex;
        //没有交换停止循环
        if(isSorted){
            break;
        }
    }
}

四、总结:

  • 好了,代码撸完,我们总结一下
    • 定义是否交换,可以提前结束循环

    • 定义无序边界,可以减少循环次数

    • 数字交换的代码常用必会

最后这个题是,最近面试遇到的题,考点是基于传统冒泡排序的优化,希望小伙伴们遇到时候可以记得看过这篇文章~冲呀!