快速排序(随机主元)、随机数生成和随机选择算法

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

快速排序(朴素)

#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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值