“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²) - 解决这个时间复杂度的话,可以
随机选择标准元素 - 这个算法考察了我们对
递归的理解 - 还有就是
元素交换部分的代码
- 首先他的平均