前几天为一个朋友写个排序,他要求排的数据是混合型的,即:adf54898,5485455,dsfdsf等一系列数据,若单纯是数字类型,我相信很多朋友都感觉没问题,我开始也一样,后来一做才知道不是那么回事,针对这些首先要考虑的第一步就是分清数字和字母,分别比较,然后才能比出大小,后来我在网上查一些资料时发现,网上有很多都写着通用快速排序法,可是一看,都缺少主要代码,都是一个人写后被多个网站摘录,改改名称来提高访问量而已,都无法直接使用,因此本人亲自写了这个功能,希望对大家有用处:
public void QuickSort(ref string[] str1,ref string[] str2)//存进要排序的字符数组前者是要进行判断的依据,后者是原整个记录
{
int Low,High;
Low = 0;
High=str1.Length-1;
STSort(str1,str2,Low,High);
}
public static void STSort(string[] strA,string[] strB, int low, int high) //确定一个数在数列中的位置
{
int IndexNow=low;//用来保存因子的位置
string md=strA[low]; //每一次都是从分割来的数组中选择第一个数为因子
string ys = strB[low];
int i=low,t=high;
while (i<t) //开始寻找此因子在数列中的位置
{
//第一步从右向左查询
while ((!strcompare(md,strA[t])) && (i < t))
t--;
if (i<t)
{
if (strcompare(md, strA[t]))
{
IndexNow = t; //当前因子要达到的位置
strA[i] = strA[t];
strA[t] = md;
//对原整个记录进行交换
strB[i] = strB[t];
strB[t] = ys;
}
}
//第二步从左向右查询
while ((strcompare(md, strA[i])) && (i < t))
i++;
if (i < t)
{
if (!strcompare(md, strA[i]))
{
IndexNow = i; //当前因子要达到的位置
strA[t] = strA[i];
strA[i] = md;
//对原整个记录进行交换
strB[t] = strB[i];
strB[i] = ys;
}
}
}
if((IndexNow-low)>1)
STSort(strA,strB, low, IndexNow-1); //左边列继续查询
if ((high - IndexNow) > 1)
STSort(strA,strB, IndexNow + 1, high);//右边列继续查询
}
网上很多只写了上面的思路,但是没有给出下面的代码,所以下面才是最重要的,没有下面是完不成通用排序这个功能:
public static bool strcompare(string A, string B)
{
int t = 0, r = 0;
//以下进行纯数字字符判断大小
managestr isnm = new managestr();
if((isnm.isnum(A))&&(isnm.isnum(B)))
{
if(A.Length>B.Length)
return true;
if(A.Length<B.Length)
return false;
if(A.Length==B.Length)
{
r = A.Length;
for (int i = 0; i < r; i++)
{
t = (A.Substring(i, 1)).CompareTo(B.Substring(i, 1));
if (t > 0)
{
return true; //返回值就不必再用break因为已经相当于退出
}
if (t < 0)
{
return false;
}
}
if (t == 0)
return true;
}
}
else
//以下进行混杂字符判断大小
{
if(A.Length>B.Length)
r=B.Length;
else
r=A.Length;
for (int i = 0; i < r; i++)
{
t = (A.Substring(i, 1)).CompareTo(B.Substring(i, 1));
if (t > 0)
{
return true; //返回值就不必再用break因为已经相当于退出
}
if (t < 0)
{
return false;
}
}
if (t == 0)
return true;
}
return true;
}
public bool isnum(string str)//判断单个字符是否为数字
{
int b;
b = 0;
Regex re = new Regex(@"^0|[0-9]*[1-9][0-9]*$");
for (int i = 0; i < str.Length; i++)
{
if (!re.IsMatch(str.Substring(i,1)))
{
b = 1;
break;
}
}
if (b != 1)
return true;
else
return false;
}
以上是我的一点点成果,若大家有谁有更好的方法或者建议请提出来,共同学习