
思考过程:
示例对话:
候选人:"请问函数签名需要完全按照标准库的sort接口,还是可以自定义?输入范围是否包含两端?" 面试官:"请实现对一个vector的原地排序,包含两端索引"
// 基础分区函数
int partition(vector<int>& nums, int left, int right) {
int pivot = nums[right]; // 选择最右元素作为基准
int i = left;
for (int j = left; j < right; ++j) {
if (nums[j] < pivot) {
swap(nums[i], nums[j]);
++i;
}
}
swap(nums[i], nums[right]);
return i;
}
// 基础递归实现
void quickSort(vector<int>& nums, int left, int right) {
if (left >= right) return; // 递归终止条件
int pivot_pos = partition(nums, left, right);
quickSort(nums, left, pivot_pos - 1);
quickSort(nums, pivot_pos + 1, right);
}初始数组:[3, 1, 4, 1, 5, 9, 2, 6]
↑ ↑
left right
分区过程(pivot=6):
[3,1,4,1,5,2] 6 [9] // 最终i=5, 交换6到正确位置边写边说的示例:
"这个基础版本的时间复杂度:
int medianOfThree(vector<int>& nums, int left, int right) {
int mid = left + (right - left) / 2;
if (nums[left] > nums[mid]) swap(nums[left], nums[mid]);
if (nums[left] > nums[right]) swap(nums[left], nums[right]);
if (nums[mid] > nums[right]) swap(nums[mid], nums[right]);
return mid;
}
int partition(vector<int>& nums, int left, int right) {
int pivot_idx = medianOfThree(nums, left, right);
swap(nums[pivot_idx], nums[right]); // 将基准放到最右
// 剩余逻辑不变...
}void insertionSort(vector<int>& nums, int left, int right) {
for (int i = left + 1; i <= right; ++i) {
int key = nums[i];
int j = i - 1;
while (j >= left && nums[j] > key) {
nums[j + 1] = nums[j];
--j;
}
nums[j + 1] = key;
}
}
void quickSort(vector<int>& nums, int left, int right) {
if (right - left <= 16) { // 阈值通常取8-32
insertionSort(nums, left, right);
return;
}
// 剩余逻辑不变...
}void quickSort(vector<int>& nums, int left, int right) {
while (left < right) { // 改用循环
int pivot_pos = partition(nums, left, right);
if (pivot_pos - left < right - pivot_pos) {
quickSort(nums, left, pivot_pos - 1);
left = pivot_pos + 1;
} else {
quickSort(nums, pivot_pos + 1, right);
right = pivot_pos - 1;
}
}
}需要提及的要点:
mid = left + (right - left)/2void quickSort3Way(vector<int>& nums, int low, int high) {
if (low >= high) return;
int lt = low, gt = high;
int pivot = nums[low];
int i = low;
while (i <= gt) {
if (nums[i] < pivot) {
swap(nums[lt++], nums[i++]);
} else if (nums[i] > pivot) {
swap(nums[i], nums[gt--]);
} else {
i++;
}
}
quickSort3Way(nums, low, lt - 1);
quickSort3Way(nums, gt + 1, high);
}#include <vector>
#include <algorithm>
using namespace std;
const int INSERTION_THRESHOLD = 16;
void insertionSort(vector<int>& nums, int left, int right) {
for (int i = left + 1; i <= right; ++i) {
int key = nums[i];
int j = i - 1;
while (j >= left && nums[j] > key) {
nums[j + 1] = nums[j];
--j;
}
nums[j + 1] = key;
}
}
int medianOfThree(vector<int>& nums, int left, int right) {
int mid = left + (right - left) / 2;
if (nums[left] > nums[mid]) swap(nums[left], nums[mid]);
if (nums[left] > nums[right]) swap(nums[left], nums[right]);
if (nums[mid] > nums[right]) swap(nums[mid], nums[right]);
return mid;
}
int partition(vector<int>& nums, int left, int right) {
int pivot_idx = medianOfThree(nums, left, right);
swap(nums[pivot_idx], nums[right]);
int pivot = nums[right];
int i = left;
for (int j = left; j < right; ++j) {
if (nums[j] < pivot) {
swap(nums[i], nums[j]);
++i;
}
}
swap(nums[i], nums[right]);
return i;
}
void optimizedQuickSort(vector<int>& nums, int left, int right) {
while (left < right) {
if (right - left <= INSERTION_THRESHOLD) {
insertionSort(nums, left, right);
return;
}
int pivot_pos = partition(nums, left, right);
// 优先处理小的部分,减少递归深度
if (pivot_pos - left < right - pivot_pos) {
optimizedQuickSort(nums, left, pivot_pos - 1);
left = pivot_pos + 1;
} else {
optimizedQuickSort(nums, pivot_pos + 1, right);
right = pivot_pos - 1;
}
}
}
void sort(vector<int>& nums) {
if (nums.empty()) return;
optimizedQuickSort(nums, 0, nums.size() - 1);
}
当完成基本实现后,可以主动引导讨论:
根据多数科技公司的面试评分标准,手写快排序题的评估维度通常包括:
评分维度 | 基础实现 | 优化实现 | 最优实现 |
|---|---|---|---|
正确性 | ✓ | ✓ | ✓ |
边界处理 | ✗ | ✓ | ✓ |
时间复杂度分析 | 基础 | 详细 | 全面 |
空间优化 | ✗ | 部分 | ✓ |
代码风格 | 一般 | 良好 | 优秀 |
工程实践考量 | ✗ | 部分 | ✓ |
手写快速排序的面试过程,实际上是考察候选人从"能工作"到"优秀"的思维演进能力。优秀的候选人应该:
记住:面试官关心的不是你能否背出算法,而是你解决问题的思路和持续优化的能力。通过这样结构化的应对策略,你就能在排序算法面试中脱颖而出。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。