快速排序
原理思想
• 分治思想:快速排序遵循分治策略,将一个大问题(对整个数组排序)分解成多个小问题(对划分后的子数组排序)。先选择数组中的一个元素作为“基准”元素,比如常选第一个或最后一个元素。
• 划分操作:通过双指针法(左右指针),从数组两端开始扫描,将小于基准的元素移到左边,大于基准的元素移到右边,最终确定基准元素的正确位置,使数组以基准为界分为左右两部分,左边元素都小于等于它,右边元素都大于等于它。
代码实现要点
• 划分函数:
传入待排序数组、起始索引与结束索引,函数内通过指针移动交换元素来完成划分,返回基准元素最终位置索引,便于后续递归调用。
需注意指针移动条件及元素交换逻辑,避免越界等错误。
• 递归调用:
基于划分后基准元素的位置,分别对左右子数组进行递归排序,递归的边界条件通常是子数组长度大于1(即起始索引小于结束索引)。
合理设置递归终止情况,防止无限递归。
代码:
#include
#include
using namespace std;
// 交换两个元素的函数
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
// 划分函数,选择一个基准元素,将数组划分为两部分
int partition(vector& arr, int low, int 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 quickSort(vector& arr, int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}
// 打印数组元素的函数,方便查看排序结果
void printArray(const vector& arr) {
for (int num : arr) {
cout << num << " ";
}
cout << endl;
}
int main() {
vector arr = { 12, 11, 13, 5, 6 };
int n = arr.size();
quickSort(arr, 0, n - 1);
cout << "排序后的数组: ";
printArray(arr);
return 0;
}
• 分治思想:快速排序遵循分治策略,将一个大问题(对整个数组排序)分解成多个小问题(对划分后的子数组排序)。先选择数组中的一个元素作为“基准”元素,比如常选第一个或最后一个元素。
• 划分操作:通过双指针法(左右指针),从数组两端开始扫描,将小于基准的元素移到左边,大于基准的元素移到右边,最终确定基准元素的正确位置,使数组以基准为界分为左右两部分,左边元素都小于等于它,右边元素都大于等于它。
代码实现要点
• 划分函数:
传入待排序数组、起始索引与结束索引,函数内通过指针移动交换元素来完成划分,返回基准元素最终位置索引,便于后续递归调用。
需注意指针移动条件及元素交换逻辑,避免越界等错误。
• 递归调用:
基于划分后基准元素的位置,分别对左右子数组进行递归排序,递归的边界条件通常是子数组长度大于1(即起始索引小于结束索引)。
合理设置递归终止情况,防止无限递归。
代码:
#include
#include
using namespace std;
// 交换两个元素的函数
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
// 划分函数,选择一个基准元素,将数组划分为两部分
int partition(vector& arr, int low, int 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 quickSort(vector& arr, int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}
// 打印数组元素的函数,方便查看排序结果
void printArray(const vector& arr) {
for (int num : arr) {
cout << num << " ";
}
cout << endl;
}
int main() {
vector arr = { 12, 11, 13, 5, 6 };
int n = arr.size();
quickSort(arr, 0, n - 1);
cout << "排序后的数组: ";
printArray(arr);
return 0;
}
全部评论
相关推荐
03-11 11:20
青海大学 运维工程师
Kurumis:整个简历看下来就发现你其实对测试理解还很浅,很多地方都是硬凑上去,项目也是学生课设级别,没什么含金量
首先是学习建议:
1.系统性了解一个真实工程的框架,有利于你后续提升项目含金量,理解测试的逻辑
2.真正去学一下自动化测试和性能测试
再就是简历本身包装问题:
1.投测试的话就不要说自己独立开发自己测,专注描述自己怎么做测试的
2.项目经历太像套话,很容易让人怀疑你到底真的做过没有,比如并发是具体做了多少并发?自动化脚本是怎么跑兼容性和性能测试的?测试用例写了多少条?
3.教务管理系统一听就是数据库课设作业,含金量不高,不过你可以在原项目基础上重构扩展,比如添加docker容器部署MySQL和Redis,添加消息队列和锁机制防止系统扛不住高并发访问,让它真的像个实际工程
4.技能里性能专项测试没有把握不要乱写,就写你会什么工具就行了,做专项性能测试的都是行业大佬,你要写的话一定要有对应的专项性能测试项目
5.可以在简历里附上项目链接,压缩简历内容的同时提升简历真实性 点赞 评论 收藏
分享
03-28 20:13
东南大学 Java 点赞 评论 收藏
分享