⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kuai.h

📁 改进的快速排序程序
💻 H
字号:
template <typename My> bool Kuai1(My*p,int num)//简单快速排序,升序,O(N log2 N)
{
	if(num<=1)return true;///递归终止条件
	int i;
	My *temp;
	temp=new My[num];
	if(!temp)
		return false;
	int tsmall=0,big=num-1;//升序
	for(i=1;i<num;i++)
	{
		My &a=p[i];
		if(a>p[0])//大的
		{
			temp[big]=a;
			big--;
		}
		else
		{
			temp[tsmall]=a;
			tsmall++;
		}
	}
	temp[big]=p[0];
	for(i=0;i<num;i++)
	{
		p[i]=temp[i];
	}
	delete[]temp;
	if(Kuai1(p,big) && Kuai1(p+big+1,num-big-1))
	{
		return true;
	}
	return false;
}

template <typename My> bool Kuai2(My*p,int num)//稍作改进
{
//	cout<<"进入函数  "<<num<<endl;
	int i;
	int n_small=1,n_big=num-1;//升序
	My m_key=p[0];
	bool xiaokong=true;//小头有空
	My *p_free=p;

	if(num<=1)return true;///递归终止条件
	for(i=0;i<num-1;i++)
	{
/*
		for(int i=0;i<num;i++)
		{
			cout<<' '<<p[i];
		}
		cout<<endl<<endl;
*/
		if(xiaokong)//小头有空//从大头取元素
		{
			if(p[n_big]<m_key)//小的
			{
				*p_free=p[n_big];
				p_free=p+n_big;
				n_big--;
				xiaokong=false;
			}
			else
			{
				n_big--;
			}
		}
		else//大头有空
		{
			if(p[n_small]<m_key)//小的
			{
				n_small++;
			}
			else
			{
				*p_free=p[n_small];
				p_free=p+n_small;
				n_small++;
				xiaokong=true;
			}
		}
	}
	*p_free=m_key;
/*
	for(i=0;i<num;i++)
	{
		cout<<' '<<p[i];
	}
	cout<<endl<<endl;
	cout<<"此时 n_big="<<n_big<<" n_small="<<n_small<<endl;//<<" ="<<<<" ="<<<<" ="<<<<" ="<<<<" ="<<;
*/
	int num1=p_free-p;
	int num2=num-num1-1;
//	cout<<"进入递归:p:"<<p<<' '<<num1<<"个 "<<num2<<"个。"<<endl;
	if(Kuai2(p,num1) && Kuai2(p+num1+1,num2))
	{
//		cout<<"递归返回。"<<endl;
		return true;
	}
	return false;
}


template <typename My> bool Kuai3(My*p,int num)//又稍作改进(可是速度变慢了)
{
	if(num<=1)return true;///递归终止条件
	int i;
	int n_small=1,n_big=num-1;//升序
	My m_key=p[0];
	bool xiaokong=true;//小头有空
	My *p_free=p;
	My *a;
	for(i=0;i<num-1;i++)
	{
		if(xiaokong)//小头有空
		{
			a=&(p[n_big]);//从大头取元素
		}
		else//大头有空
		{
			a=&(p[n_small]);
		}
		bool a_small=*a<m_key;
		if(a_small && xiaokong || !a_small && !xiaokong)//
		{
			*p_free=*a;
			if(xiaokong)
			{
				p_free=p+n_big;
				n_big--;
			}
			else
			{
				p_free=p+n_small;
				n_small++;
			}
			xiaokong=!xiaokong;
		}
		else
		{
			if(xiaokong)
			{
				n_big--;
			}
			else
			{
				n_small++;
			}
		}
	}
	*p_free=m_key;
	if(Kuai3(p,n_big) && Kuai3(p+n_small,num-n_big-1))
	{
		return true;
	}
	return false;
}//



	

template <typename T> void MaoPao(T* a,int n)//冒泡排序,用于与之对比
{
	bool noswap;//o(n2/2)
	int i,j;
	T temp;
	for (i=0;i<n-1;i++){             //最多做n-1趟
		noswap=true;	              //未交换标志为真
		for(j=n-1;j>i;j--){          //从下往上冒泡
			if(a[j]<a[j-1]){
				temp=a[j];
				a[j]=a[j-1];
				a[j-1]=temp;
				noswap=false;
			}			
		}
		if(noswap) break;	         //本趟无,则终止算法。
	}
}


template <typename My> void Kuai4(My*p,int num)
{
	int i;
	int n_small=1,n_big=num-1;//升序
	My m_key=p[0];
	bool xiaokong=true;//小头有空
	My *p_free=p;

//	if(num<=1)return true;///递归终止条件
	for(i=0;i<num-1;i++)
	{
		if(xiaokong)//小头有空//从大头取元素
		{
			if(p[n_big]<m_key)//小的
			{
				*p_free=p[n_big];
				p_free=p+n_big;
				n_big--;
				xiaokong=false;
			}
			else
			{
				n_big--;
			}
		}
		else//大头有空
		{
			if(p[n_small]<m_key)//小的
			{
				n_small++;
			}
			else
			{
				*p_free=p[n_small];
				p_free=p+n_small;
				n_small++;
				xiaokong=true;
			}
		}
	}
	*p_free=m_key;
	int num1=p_free-p;
	int num2=num-num1-1;
	if(num1>1)
		Kuai4(p,num1);
	if(num2>1)
		Kuai4(p+num1+1,num2);
	return;
}

template <typename My> void Kuai5(My*p,int num)
{
	int i;
	int n_small=1,n_big=num-1;//升序
	My m_key=p[0];
	int n_free=0;
	bool xiaokong=true;//小头有空
	
	for(i=0;i<num-1;i++)
	{
		if(xiaokong)//小头有空//从大头取元素
		{
			if(p[n_big]<m_key)//小的
			{
				p[n_free]=p[n_big];
				n_free=n_big;
				xiaokong=false;
			}
			n_big--;
		}
		else//大头有空
		{
			if(p[n_small]>m_key)//大的
			{
				p[n_free]=p[n_small];
				n_free=n_small;
				xiaokong=true;
			}
			n_small++;
		}
	}
	p[n_free]=m_key;
	int num1=n_free;
	int num2=num-num1-1;
	if(num1>1)
		Kuai5(p,num1);
	if(num2>1)
		Kuai5(p+num1+1,num2);
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -