好久没写博客了
最近打算把之前的一些学习笔记发到博客上
今天就用经典的快排做开头吧
快排是一种在一般情况下性能稳定的排序算法,在排序序列基本有序的情况下会退化成O(n^2)的效率 。
好像自从上了研究生就没写过快排了 ,今天照着印象里的方法用c++写了一个,代码实现一定不算优雅,但是逻辑应该是清晰的。
void QuickSort(std::vector<int>& nums, int begin , int end){
if(end - begin + 1 < 2) return ;
int pivotVal = nums[begin]; //保存pivot的值
int left = begin;
int right = end;
bool ChooseWay = true;
while(left < right){
if(ChooseWay){ //从右往左
if(nums[right] >= pivotVal) {
right --;
continue;
}
nums[left] = nums[right]; // nums[left]的位置由nums[right]的值覆盖
left ++ ; // left 向右移动一位,作为下次移动的开始
ChooseWay = false;
}
else{
if(nums[left] <= pivotVal){
left ++;
continue;
}
nums[right] = nums[left];// nums[right]的位置由nums[left]的值覆盖
right --;
ChooseWay = true;
}
}
// 退出循环时, left = right ,这个下标的左侧都比pivotVal小,右侧都比pivotVal大
nums[left] = pivotVal;
QuickSort(nums,begin,left-1); //开始到 pivot的左侧
QuickSort(nums,left+1,end);
}
递归应该遵循三步的方式来写, 首先要想递归的退出条件,不然会陷入无限递归,然后爆栈。
这里的条件是子序列的长度大于等于2时继续递归,小于2即返回。
ChooseWay用于选择此时应该移动的下标,true为右,false为左。
其他的逻辑就不赘述了。
int main(){
std::vector<int> nums{2,3,49,6,34,5,33,55,66,33,33,75};
QuickSort(nums,0,nums.size()-1);
for(auto i : nums){
std::cout<< i <<" ";
}
std::cout<<std::endl;
}
用下列程序测试如下结果
C:\Users\stan\Desktop\Cpp-Primer-Plus-6th-main\quicksort.exe
2 3 5 6 33 33 33 34 49 55 66 75
进程已结束,退出代码为 0

3137

被折叠的 条评论
为什么被折叠?



