快速排序(算法分析与设计)c++

 

#include <iostream>
using namespace std;

void Swap(int a,int b)			//a,b交换位置 
{
	int c=a;
	a=b;
	b=c;
 } 
int Partition(int a[],int p,int r)//Partition的作用是将基准元素置于本应在序列中的位置,
{								  // 并保存该基准在数组中的下标(位置),还让其前面的元素 
								  // 均小于该基准,后面的元素均大于该基准 
									
	int i=p,j=r+1;				//i为基准位置,r为要排序的数组中最后一个元素下标 
	int x=a[p];					//x为选取的基准 ,p为基准未排序前在数组中的位置            
	while(true)					//						  x 
	{							//数组a[p:r]:    		  p,p+1,...,r-1, r 
								//对应i,j:	      	  i,i+1,...,j-2,j-1,j
		while (a[++i]<x&&i<j-1);//跳出第一个while说明i前面的都<x,a[i]>=x或i=j-1 
		while(a[--j]>x);		//跳出第二个while说明j后面的都>x,a[j]<=x
		if(i>=j)break;			//终止外层while循环的条件,若满足if条件说明跳出了前面两个while,
								//且i>=j,说明j前面的都<x ,j后面的都>x,
								//此时a[j]的位置j即为x本应在序列中的位置
		Swap(a[i],a[j]);		//若未终止外层循环,则说明i<j,将a[i] (>=x) 与 a[j] (<=x)互换位置 
	}
	a[p]=a[j];					//将基准x置于本应在序列中的位置 (与该位置的元素交换位置) 
	a[j]=x;
	return j;					//返回基准位置 
}
void Quicksort(int a[],int p,int r)
{
	if(p<r)
	{
		int q=Partition(a,p,r);	//将放a[p]到了自己本应在序列中的位置(与a[j]交换位置) ,
								//并将该位置j赋值给q 
		Quicksort(a,p,q-1);		//基准与位置为q的元素交换了位置,此时基准回到了自己的位置q 
		Quicksort(a,q+1,r);		//剩下的位置p~q-1,q+1~r,与对应的元素并不匹配,继续换位置 
	}
}
int main(){
	int n;
	cin>>n;		//数组元素个数 
	int a[n];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	Quicksort(a,0,n-1);		//对含有n个元素的数组a[0:n-1]快排 
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值