面试高频题目:一种优雅对称的快排源码实现
程序员文章站
2024-02-13 20:50:52
...
排序算法是整个算法体系中的最核心的一大块,而快速排序又是排序算法中最核心的一种实现,相信大家都懂排序算法的原理:
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
快速排序成为面试的高频题目,大多数人原理都懂,但要真正手写一个快速排序,并且一次性写对难度还是非常大。网上铺天盖地很多各种各样的实现,虽然都能实现功能,但大多都难懂,且写的过于冗长,不够简洁,关键是难记。是的,有时候面试前想临时抱佛脚,但无奈记住。
下面,我提供一种对称优雅的快排实现,最关键的是容易死记硬背,清晰明了。
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
QuickSort(nums,0,nums.size()-1);
return nums;
}
void QuickSort(vector<int>& nums,int left,int right){
//选择一个中间值
int pivot = nums[left+(right-left)/2];
int l = left;
int r = right;
while(l < r){
while(nums[l] < nums[pivot])
l++;
while(nums[r] > nums[pivot])
r--;
if(l >= r){
break;
}
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
}
if(l <= left)
QuickSort(nums,l,left);
if(r < right)
QuickSort(nums,r,right);
}
};
推荐阅读