每天一到面试题(五)

(创新工场·2013)一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有数字字符放在最前面,所有大写字符放在中间,所有小写放在最后,而且各部分内部分别有序。

分析:本质是一道排序问题,我们要做的就是把排序的规则重新定义一下:

         1)a-z > A-Z > 0-9:a-z中的所有字符大于A-Z中的所有字符大于0-9中的所有字符

         2)同一集合内比较规则不变:如a<b,A<B,0<1

代码:

//定义比较函数,重新规定比较规则
bool cmpfun(char a,char b)
{
	if ((a>='a'&&a<='z')&&!(b>='a'&&b<='z'))
	{
		return true;//a>b
	}else if ((a>='A'&&a<='Z')&&(b>='a'&&b<='z'))
	{
		return false;//a<b
	}else if ((a>='A'&&a<='Z')&&(b>='0'&&b<='9'))
	{
		return true;//a>b
	}else if ((a>='0'&&a<='9')&&!(b>='0'&&b<='9'))
	{
		return false;//a<b
	}else
	{
		return a>b;
	}

}
//排序代码(快排实现)
void sort(char a[],int pBegin,int pEnd,bool cmpfun(char,char))//[i,j]
{
	if (a==NULL||pBegin>=pEnd)
	{
		return;
	}
	else
	{
		int i=pBegin;
		int j=pEnd;
		char tmp=a[i];
		while (i<j)
		{
			while (i<j&&(!cmpfun(tmp,a[j])))//tmp<=a[j]
			{
				j--;
			}
			if (i<j)
			{
				a[i]=a[j];
			}
			while(i<j&&(!cmpfun(a[i],tmp)))//tmp>=a[i]
			{
				i++;
			}
			if (i<j)
			{
				a[j]=a[i];
			}
		}
		a[i]=tmp;
		sort(a,pBegin,i-1,cmpfun);
		sort(a,i+1,pEnd,cmpfun);
	}
}

你可能感兴趣的:(每天一到面试题(五))