(创新工场·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); } }