东风湖
收藏于2025-06-22
转藏1次
快速 排序 是一种高效的排序 算法 ,采用 分治策略 对数据进行排序。本文实现的快速排序版本使用了 递归 方式和独特的 基准值选择 方法。
主要特点 :
分治思想 :将大问题分解为小问题解决
递归实现 :简洁清晰的代码结构
原地排序:不需要额外 存储 空间(本实现使用了辅助空间)
平均 时间复杂度 :O(n log n)
基准值选择:基于最大值取模的独特方法
相比冒泡排序、插入排序等其他算法,快速排序有以下优势:
效率高 :平均情况下比O(n²)算法快得多
实现简单 :递归实现代码简洁
适应性强 :适合各种规模的数据集
空间效率 :本实现虽用辅助空间,但可 优化 为原地排序
基准值创新 :独特的基准值选择方法增加随机性
1. 基准值选择 :
找到 数组 最大值
用最大值取模确定基准值位置
2. 分区过程 :
创建左右两个子数组
小于基准值的放左边,大于的放右边
3. 递归排序 :
对左右子数组递归调用快速排序
合并排序后的子数组和基准值
4. 终止条件 :
数组长度小于2时直接返回
#include<iostream>
#include<vector>
using namesp AC e std;
// 选择基准值的函数
int idx(vector<int> a) {
int maxv = 0; // 初始化最大值
// 遍历数组找出最大值
for (int i = 0;i < a.size();i++)maxv = max(maxv, a[i]);
// 返回最大值对数组长度取模位置的元素作为基准值
return a[maxv % a.size()];
}
// 快速排序主函数
void quicksort(vector<int>& a) {
// 基本情况:数组长度小于2时已有序
if (a.size() < 2)return;
// 获取基准值
int val=idx(a);
vector<int> left; // 存储小于基准值的元素
vector<int> right; // 存储大于基准值的元素
// 分区过程
for (int i = 0;i < a.size();i++) {
if (a[i] < val)left.push_back(a[i]);
else if (a[i] > val)right.push_back(a[i]);
}
// 递归排序左右子数组
quicksort(left);
quicksort(right);
// 合并结果:左数组 + 基准值 + 右数组
a.clear();
for (int i = 0;i < left.size();i++)a.push_back(left[i]);
a.push_back(val);
for (int i = 0;i < right.size();i++)a.push_back(right[i]);
}
本文介绍了一个基于递归和独特基准值选择方法的快速排序实现。通过详细的代码注释和分步解析,展示了快速排序的核心思想和实现细节。这种实现方式虽然使用了额外的存储空间,但代码清晰易懂,非常适合教学和理解快速排序的基本原理。读者可以在此基础上进一步优化,如实现原地排序或改进基准值选择策略。