目录
1.排序数组
912. 排序数组 - 力扣(LeetCode)
https://leetcode.cn/problems/sort-an-array/
cpp
class Solution {
public:
int partition(vector<int>& arr, int low, int high) {
int pivot_idx = low + rand() % (high - low + 1);
swap(arr[pivot_idx], arr[high]);
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
return i + 1;
}
// 快速排序主函数
void quick_sort(vector<int>& arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quick_sort(arr, low, pi - 1);
quick_sort(arr, pi + 1, high);
}
}
vector<int> sortArray(vector<int>& nums) {
quick_sort(nums, 0, nums.size() - 1);
return nums;
}
};
a.核心思想
采用随机化 快速排序实现高效排序,通过随机选择枢轴元素避免最坏时间复杂度,实现原地分区操作,满足O(n log n)时间复杂度要求,同时保持低空间复杂度特性。
b.思路
① 分治 **策略:**将数组分割为独立子问题递归解决
**② 随机枢轴:**通过随机选择基准值避免已排序数组导致的性能退化
**③ 原地分区:**通过元素交换实现O(1)额外空间占用
④ 递归 **优化:**仅对非空子数组进行递归调用
c.步骤
① 分区操作:
随机选枢轴:在
[low, high]范围内随机选择索引作为枢轴枢轴归位:将枢轴元素交换至数组末尾
元素重排:遍历数组,将小于枢轴的元素移到左侧
枢轴定位:将枢轴交换到正确位置,返回其索引
② 递归 排序:
基准条件:子数组长度大于1时继续递归
分治处理:对枢轴左侧和右侧子数组分别递归排序
③ 入口函数:
启动排序:调用快速排序函数处理整个数组
返回结果:返回排序后的数组
2.野指针和空指针的区别
| 野指针 | 空指针 | |
|---|---|---|
| 定义 | 未被初始化,或指向的内存已被释放/无效的指针,其值不确定且可能危险。 | 明确被赋值为 nullptr(C++11 起)或 NULL 的指针,表示"不指向任何有效对象"。 |
| 成因 | 未初始化、内存释放后未置空,或指针越界访问。 | 主动赋值为空。 |
| 危害 | 解引用可能导致未定义行为(如数据损坏、隐蔽崩溃),难以调试。 | 解引用时通常直接崩溃(如 *p 会触发段错误),易排查。 |
| 规避方法 | 初始化指针、释放内存后立即置空、避免返回局部变量指针。 | 显式初始化为 nullptr,使用前检查。 |
希望这些内容对大家有所帮助!
感谢大家的三连支持!