求逆序数,快排
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; }