4.补充题:手撕快速排序
给你一个整数数组 nums
,请你将该数组升序排列。
你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n))
,并且空间复杂度尽可能小。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
思路详解:快速排序是一种分治的思想,先选一个基准元素,将所有大于基准元素的元素放到基准元素的右边,所有小于基准元素的放到左边,然后数组就被基准元素拆成两个数组,再对被拆分的数组进行快速排序,重复上面的步骤直到左右指针重合。如果不理解可以看以下图片
这是第一次快速排序,下次快速排序时重新选择基准元素,再以此法排序

代码详解:
cpp
class Solution {
public:
void quicksort(vector<int>& v, int start, int end) {
if (start >= end) {
return;
}
int temp = v[start]; // 区域内的第一个元素定位基准值
int i = start - 1, j = end + 1;//设置左边界和右边界
int index = start;//将第一个元素作为索引
while (index < j) {
if (v[index] == temp) {
index++;
} else if (v[index] > temp) {
swap(v[--j], v[index]);
} else {
swap(v[++i], v[index++]);//开始交换,如果待排元素小于基准元素就放到基准元素的左边,否则就放到右边
}
}//第一次分割完数组后,重新排序左边和右边的数组
quicksort(v, start, i);//排序左边的数组
quicksort(v, j, end);//排序右边的数组
}
vector<int> sortArray(vector<int>& nums) {
quicksort(nums,0,nums.size()-1);//调用函数即可
return nums;
}
};
面经
1. 什么是c++中的lamabda表达式,有什么作用,如何使用lamabda表达式
lambda表达式是一个匿名内联函数包括引用捕获和值(只读)捕获
作用是在函数内部定义一个函数,可以帮助函数访问作用域之外的其他变量
全局变量不需要捕获
捕获列表\] 函数参数 返回值 {函数体}
没有参数可以不写(),返回值也可以不写,编译器会自动推导返回值类型,但是当基于列表返回时不能推导如:return {1,2,3}
```cpp
//此时应该写为:
auto f1=[]()->vector