快速排序

204 阅读1分钟

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

一、题目描述

  • 这是我面试中被问到的一道题,也是排序中非常经典的一道排序算法题,就是将给你一个无序的数组,让你使用快速排序算法!

二、思路分析

  • 这个算法运用了递归的思想
    • 从待排序的数组中选取一个数当作标准
    • 把比标准小的数放到标准数的前面
    • 把比标准数大的放到标准数的后面(相同的放在左右都可)
  • 把标准数前面和后面的数重复上述操作(即递归)

三、AC 代码:

public static void quickSort(int[] arr, int startIndex, int endIndex){
    //递归终止条件
    if(startIndex >= endIndex){
        return;
    }
    
    //选取标准元素位置
    int pivotIndex = partition(arr, startIndex, endIndex);
    
    //根据标准元素位置,进行前后递归
    quickSort(arr, startIndex, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, endIndex);
}

private static int partition(int[] arr, int startIndex, int endIndex){
    //我这里用第一个元素作为标准元素
    int pivot = arr[startIndex];
    int mark = startIndex;
    
    for(int i = startIndex + 1; i <= endIndex; i++){
        if(arr[i] < pivot){
            mark++;
            int p = arr[mark];
            arr[mark] = arr[i];
            arr[i] = p;
        }
    }
    
    arr[startIndex] = arr[mark];
    arr[mark] = pivot;
    return mark;
}

四、总结:

  • 好了,代码撸完,我们总结一下
    • 首先他的平均时间复杂度是O(nlogn),但最坏的情况下,他会达到O(n²)
    • 解决这个时间复杂度的话,可以随机选择标准元素
    • 这个算法考察了我们对递归的理解
    • 还有就是元素交换部分的代码

最后这个算法是面试常考的哦,希望小伙伴们都能掌握这道题,顺利拿到心仪的Offer,明天见!