快速排序(朴素)
#include<bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
/*实际过程见算法笔记p142、p143*/
int partition(int a[],int left,int right)
{
int temp=a[left];
while(left<right)
{
while(left<right&&a[right]>temp) right--;//如果right所指的元素大于主元temp,则指针不断左移至找到一个小于等于主元temp的
a[left]=a[right];//当前a[right]小于主元temp,于是将right上的元素挪到left上
while(left<right&&a[left]<=temp) left++;//如果left所指的元素小于等于主元temp,则指针不断右移至找到一个大于主元temp的
a[right]=a[left];
}
a[left]=temp;//现在已经满足left左边全部小于等于temp,right右边全部大于temp,于是把主元temp放在正确的位置,即left==right(两个pointer相遇的地方)
return left;//注意本行与上行中left==right,本行代表返回主元经一轮交换后的位置
}
void quick_sort(int a[],int left,int right)//left、right初值分别为待排序序列首尾下标
{
if(left<right)//当前待排序的子区间长度不超过1
{
int pos=partition(a,left,right);
quick_sort(a,left,pos-1);//对左子区间快排
quick_sort(a,pos+1,right);//对右子区间快排
}
}
signed main(void)
{
int n;
int a[1000];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
quick_sort(a,1,n);
for(int i=1;i<=n-1;i++)
cout<<a[i]<<" ";
cout<<a[n]<<endl;
return 0;
}
快速排序算法针对完全无序时效率最高,但当接近有序时,效率会达到最坏的O(n²),产生这种情况的主要原因是主元没有把当前区间划分为两个长度接近的子区间,解决的办法就是随机选择主元,即对于a[left...right],不总是以a[left]作为主元,而是从a[left]、a[left+1]...a[ri

博客内容介绍了快速排序算法的朴素实现及其优化——随机主元的选择,详细解析了随机主元如何提升排序效率,以及如何利用随机选择算法解决寻找序列中第k小元素的问题。此外,还展示了随机选择算法在求解序列中元素之和差最大值问题的应用。
最低0.47元/天 解锁文章
6205

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



