快速排序法及其应用

冒泡法:

/*
//对数组排序
int len=100;
float* arry= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry[i]=rand();
}
Sort(arry,len,true);
delete[] arry;
*/
template<typename T>
void Sort(T* arry,int size,bool Ascending = true)
{
	T tVal;
	if(Ascending)
	{
		for(int i=0;i<size-1;i++)
		{
			for(int j=i+1;j<size;j++)
			{
				if(arry[i]>arry[j])
				{
					tVal = arry[i];
					arry[i]= arry[j];
					arry[j]=tVal;
				}
			}
		}
	}
	else
	{
		for(int i=0;i<size-1;i++)
		{
			for(int j=i+1;j<size;j++)
			{
				if(arry[i]<arry[j])
				{
					tVal = arry[i];
					arry[i]= arry[j];
					arry[j]=tVal;
				}
			}
		}
	}
}

快速排序法:

/*
//快速排序法
int len=100;
float* arry= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry[i]=rand();
}
QSort(arry,0,len-1,true);
delete[] arry;
*/
template<typename T>
void QSort(T* arry,int left,int right,bool Ascending = true)
{
	int l,r;
	T t,m;
	l=left;
	r=right;
	m=arry[(left+right)/2];

	if(Ascending)
	{
		while(l<r)
		{
			while(arry[l]<m)l++;
			while(arry[r]>m)r--;
			if(l>=r)break;

			t=arry[l];
			arry[l]=arry[r];
			arry[r]=t;

			if(arry[l]!=m)l++;
			r--;
		}
	}
	else
	{
		while(l<r)
		{
			while(arry[l]>m)l++;
			while(arry[r]<m)r--;
			if(l>=r)break;

			t=arry[l];
			arry[l]=arry[r];
			arry[r]=t;

			if(arry[l]!=m)l++;
			r--;
		}
	}

	if(l==r)l++;
	if(left<r)QSort(arry,left,r,Ascending);
	if(l<right)QSort(arry,l,right,Ascending);
}

两种算法在数据量较小时差异不大,但是如果数据量达到上万条,两者的差异非常大,快速排序法在几毫秒内完成的工作冒泡法需要几十秒甚至更长。

下面列出对快速排序法的一些应用:

1.协同排序

/*
//协同排序,参照数组1对数组1和数组2排序,默认为升序排列
int len=100;
float* arry1= new float[len]();
float* arry2= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry1[i]=rand();
	arry2[i]=rand();
}
QConsortSort(arry1,arry2,0,len-1,true);
delete[] arry1;
delete[] arry2;
*/
template<typename TA,typename TB>
void QConsortSort(TA* arry1,TB* arry2,int left,int right,bool Ascending=true)
{
	int l,r;
	TA ta;
	TB tb;
	l=left;
	r=right;
	TA m=arry1[(left+right)/2];
	if(Ascending)
	{
		while(l<r)
		{
			while(arry1[l]<m)l++;
			while(arry1[r]>m)r--;
			if(l>=r)break;

			ta=arry1[l];
			arry1[l]=arry1[r];
			arry1[r]=ta;

			tb=arry2[l];
			arry2[l]=arry2[r];
			arry2[r]=tb;

			if(arry1[l]!=m)l++;
			r--;
		}
	}
	else
	{
		while(l<r)
		{
			while(arry1[l]>m)l++;
			while(arry1[r]<m)r--;
			if(l>=r)break;

			ta=arry1[l];
			arry1[l]=arry1[r];
			arry1[r]=ta;

			tb=arry2[l];
			arry2[l]=arry2[r];
			arry2[r]=tb;

			if(arry1[l]!=m)l++;
			r--;
		}
	}

	if(l==r)l++;
	if(left<r)QConsortSort(arry1,arry2,left,r,Ascending);
	if(l<right)QConsortSort(arry1,arry2,l,right,Ascending);
}

2.参照排序

//参照排序,参照数组1,对数组2进行排序
//排序后数组1不发生变化,数组2的顺序改变,使用快速排序法实现
template<typename T>
void QAccordingSort(T* arry1,T* arry2,int size,bool Ascending=true)
{
	int* ids = new int[size];
	for(int i=0;i<size;i++) ids[i] = i;
	QAccordingSort(arry1,ids,arry2,0,size-1,Ascending);
	delete[] ids;
}


//参照排序,参照数组1,对数组2进行排序
//排序后数组1不发生变化,数组2的顺序改变,使用快速排序法实现
//tIds是一个为了实现算法而添加的辅助数组,其初始值就是0,1,2...,size-1,用于存储arry1排序后的顺序
template<typename T>
void QAccordingSort(T* arry1,int* tIds,T* arry2,int left,int right,bool Ascending = true)
{
	int l,r,t;
	T m,tT;
	l=left;
	r=right;
	m=arry1[tIds[(left+right)/2]];

	if(Ascending)
	{
		while(l<r)
		{
			while(arry1[tIds[l]]<m) l++;
			while(arry1[tIds[r]]>m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			tT = arry2[l];
			arry2[l] = arry2[r];
			arry2[r] = tT;

			if(arry1[tIds[l]]!=m) l++;
			r--;
		}		
	}
	else
	{
		while(l<r)
		{
			while(arry1[tIds[l]]>m) l++;
			while(arry1[tIds[r]]<m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			tT = arry2[l];
			arry2[l] = arry2[r];
			arry2[r] = tT;

			if(arry1[tIds[l]]!=m) l++;
			r--;
		}
	}

	if(l==r) l++;
	if(left<r) QAccordingSort(arry1,tIds,arry2,left,r,Ascending);
	if(l<right) QAccordingSort(arry1,tIds,arry2,l,right,Ascending);
}
3.索引排序

/*
//对数组进行排序,排序结果以数组索引号的方式输出
//使用快速排序法实现
int len=100;
float* arry= new float[len]();
int* ids = new int[len];
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
	arry[i]=rand();
	ids[i]=i;
}
QIndexSort(arry,ids,0,len-1,true);
delete[] arry;
delete[] ids;
*/
template<typename T>
void QIndexSort(T *tVals,int *tIds,int left,int right,bool Ascending = true)
{
	int l,r,t;
	T m;
	l=left;
	r=right;
	m=tVals[tIds[(left+right)/2]];

	if(Ascending)
	{
		while(l<r)
		{
			while(tVals[tIds[l]]<m) l++;
			while(tVals[tIds[r]]>m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			if(tVals[tIds[l]]!=m) l++;
			r--;
		}		
	}
	else
	{
		while(l<r)
		{
			while(tVals[tIds[l]]>m) l++;
			while(tVals[tIds[r]]<m) r--;
			if(l>=r) break;

			t = tIds[l];
			tIds[l] = tIds[r];
			tIds[r] = t;

			if(tVals[tIds[l]]!=m) l++;
			r--;
		}
	}

	if(l==r) l++;
	if(left<r) QIndexSort(tVals,tIds,left,r,Ascending);
	if(l<right) QIndexSort(tVals,tIds,l,right,Ascending);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝静音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值