通用快速排序法

前几天为一个朋友写个排序,他要求排的数据是混合型的,即: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;

 

        }

以上是我的一点点成果,若大家有谁有更好的方法或者建议请提出来,共同学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值