C语言实现快排

void Qsort( int * p_int, int ll, int hh )
{
	//对地址为p_int+ll 和 p_int+hh  之间的元素实现快排 
	if( hh > ll + 1 )
	{
		//当有三个或以上元素时
		int low = ll + 1;   //以ll处的元素为枢纽
	    int high = hh;      //最高索引

	    while( 1 )
	    {
			//循环直到  比枢纽元素小的处于其左边   比枢纽元素大的处于其右边
			while( * ( p_int + low ) <= * ( p_int + ll )  && low < high )    low ++;
			while( * ( p_int + high ) > * ( p_int + ll ) && high > low )    high --;
	        if( high > low )
			{
				//swap 操作
				int temp = * ( p_int + high );
				* ( p_int + high ) = * ( p_int + low );
				* ( p_int + low ) = temp;				
			}
			else				
			{
				//  high == low 时			
				if( * ( p_int + low ) <= * ( p_int + ll ) )
				{
					//枢纽元素是最大的元素时   需要swap枢纽元素和最后一个元素
					int temp = *( p_int + ll );
					* ( p_int + ll ) = * ( p_int + low );
					* ( p_int + low ) = temp;					
					break;

				}
				else
				{
					//下标为low的元素比枢纽元素大  low之后的元素也都比枢纽元素大
					//则 swap 枢纽元素 和 low - 1处的元素	
					int temp = * ( p_int + ll );
					* ( p_int + ll ) =  * ( p_int + low - 1 ) ;
					* ( p_int + low - 1 ) = temp;					
					break;
				}
			}
		}

		Qsort( p_int, ll, low - 1 );
	    Qsort( p_int, high, hh );
	}
	else
		if( hh == ll + 1 )
		{
			//当只有两个元素时
			if( * ( p_int + hh ) < * ( p_int + ll ) )
			{	
				//元素逆向时要swap元素
				int temp = * ( p_int + hh );
				* ( p_int + hh ) = * ( p_int + ll );
				* ( p_int + ll ) = temp;				
			}
			
		}
}
 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页