C# ACM poj1007

求逆序数,快排

  public static void acm1007(int a, string[] c)

        {

            Dictionary<int, string> dic = new Dictionary<int, string>();

            int[] i = new int[a];

            var j = 0;

            foreach (var item in c)

            {

                int k = Acm1007Unit(item);

                if (!dic.ContainsKey(k))

                {

                    i[j] = k;

                    j++;

                    dic.Add(k, item + ",");

                }

                else

                {

                    dic[k] += item + ",";

                    i[j] = -1;

                    j++;

                }

            }

             QSortDIY(i, 0, i.Length - 1);



            for (int jjj = 0; jjj < i.Length ; jjj++)

            {

                if (i[jjj] != -1)

                {

                    Console.Write(dic[i[jjj]]);

                }

            }



        }

        public static int Acm1007Unit(string a)

        {

            int anum = 0;

            int cnum = 0;

            int gnum = 0;



            int r = 0;

            for (int i = a.Length - 1; i >= 0; i--)

            {

                switch (a[i])

                {

                    case 'A':

                        anum++;

                        break;

                    case 'C':

                        r += anum;

                        cnum++;

                        break;

                    case 'G':

                        r += anum + cnum;

                        gnum++;

                        break;

                    case 'T':

                        r += anum + cnum + gnum;

                        break;

                }

            }

            return r;

        }

        public static void QSortDIY(int[] array, int low, int high)

        {

            if (low >= high)

            {

                return;

            }

            int ie = QSortUnit(array, low, high);

            QSortDIY(array, low, ie - 1);

            QSortDIY(array, ie + 1, high);

        }

        private static int QSortUnit(int[] array, int low, int high)

        {

            int key = array[low];

            while (low < high)

            {

                while (array[high] >= key && high > low)

                {

                    --high;

                }

                array[low] = array[high];

                while (array[low] <= key && high > low)

                {



                    ++low;

                }

                array[high] = array[low];

            }

            array[low] = key;

            return high;

        }

 

你可能感兴趣的:(ACM)