👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> 458290771@qq.com
喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏
思想
先找到一个枢轴(基准)元素,然后用第一个元素把待排序序列“划分”为两个部分。左边更小,右边更大。
代码实现
int Partition(int A[], int low, int high){
int pivot = A[low]; // 第一个元素作为枢轴
while(low < high){ // 用low、high搜索枢轴的最终位置
while(low < high && A[high] >= pivot) --high;
A[low] = A[high]; // 比枢轴小的元素移动到左端
while(low < high && A[low] <= pivot) ++low;
A[high] = A[low]; // 比枢轴大的元素移动到右端
}
A[low] = pivot; // 枢轴元素存放到最终位置
return low; // 返回存放枢轴的最终位置
}
// 快速排序
void QuickSort(int A[], int low, int high){
if(low < high){ // 递归跳出的条件
int pivotPos = Partition(A, low, high); // 划分
QuickSort(A, low, pivotPos - 1); // 划分左子表
QuickSort(A, pivotPos + 1, high); // 划分右子表
}
}
算法效率分析
每一层的 QuickSort
只需要处理剩余的待排序元素,时间复杂度不超过
O
(
n
)
O(n)
O(n)
时间复杂度
=
O
(
n
∗
递归层数
)
时间复杂度=O(n*递归层数)
时间复杂度=O(n∗递归层数)
- 最好: O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
- 最坏: O ( n 2 ) O(n^2) O(n2)
- 平均: O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
空间复杂度 = O ( 递归层数 ) 空间复杂度=O(递归层数) 空间复杂度=O(递归层数)
- 最好: O ( l o g 2 n ) O(log_2n) O(log2n)
- 最坏: O ( n ) O(n) O(n)