欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 蓝桥杯 经典算法题 实现快速排序

蓝桥杯 经典算法题 实现快速排序

2024/10/23 23:26:11 来源:https://blog.csdn.net/zaqjkl/article/details/139871393  浏览:    关键词:蓝桥杯 经典算法题 实现快速排序

题目:

题解:

快速排序其实每次不是将大区间平均分为两个子区间(这个与每次选取的基准值有关),而是每次将区间分为全大于基准值和全小于基准值两个子区间,然后又分别在子区间中再找一个基准值再分为两个子区间如此往复最终将整个数组变得有序。

#include <bits/stdc++.h>
using namespace std;
int arr[105]={0};
void quik_sort(int l,int r){if(r-l<=0)return ;else if(r-l==1){if(arr[r]<arr[l]){swap(arr[r],arr[l]);}return ;}int ind=arr[l];int x=l,y=r;while(x!=y){while(x!=y&&arr[y]>=ind)y--;swap(arr[y],arr[x]);while(x!=y&&arr[x]<ind)x++;swap(arr[y],arr[x]);}arr[x]=ind;quik_sort(l,x);quik_sort(x+1,r);
}int main(){int n;cin>>n;for(int i=0;i<n;i++)cin>>arr[i];quik_sort(0,n-1);for(int i=0;i<n;i++)cout<<arr[i]<<" ";return 0;
}

题后反思:

如何将一个数组变为两部分左半部分全部小于右半部分:

一个最简单朴素的方法是选择第一个值作为基准值并将第一个位置空出来,然后利用左右指针,当空位在左指针时用右指针找一个小于基准值的值与左指针交换,当空位在右指针时用左指针找一个大于等于基准值的值与左指针交换,知道左右指针重合然后将基准值填到这个位置上即可。

最后终止条件的判断:

第一写的是:

if(r-l=0)return ;

然后一直报错找不到原因,因为当基准值本来因该填在最后一个位置时,x和y都指向序列的末尾,然后下一次调用时范围为(nums.size()-1,nums.size())是一个不合理的区间,这种情况因该停止排序,但是程序无法识别到,所以报错。因此要根据具体实现充分考虑因该终止时的情况。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com