using System; namespace 回溯法排序 { static class BackTraceForSort { static void Main(string[] args) { suffix = new int[v.Length]; rightSequence = new int[v.Length]; for (int m = 0; m < v.Length; m++) { suffix[m] = m; } Sort(suffix, double.MaxValue); // MaxValue是double类型的最大值 Console.Read(); } static private double[] v = new double[] { 98, 97, 99, 99 }; //等待排序的数组 static private int[] suffix; //v数组中所有数值的下标数组 static private int[] rightSequence; //保存正确的排序结果的序号 //将下标数组中的值为k的元素删除,并返回新的下标数组 static private int[] Remove(int k, int[] s) { int[] sNew = new int[s.Length - 1]; int p = 0; for (int i = 0; i < s.Length; i++) { if (s[i] != k) { sNew[p] = s[i]; p++; } } return sNew; } //形参为当前下标数组及上一状态结点的值 static private void Sort(int[] suff, double prior) { foreach (int i in suff) { if (v[i] <= prior) { rightSequence[v.Length - suff.Length] = i; //输出正确下标序列 if (suff.Length == 1) { foreach (int q in rightSequence) { Console.Write(q+ " "); } Console.WriteLine("/r/n"); } double lastNew = v[i]; int[] suffixNew = Remove(i, suff); if (suffixNew.Length > 0) { Sort(suffixNew, lastNew); //递归 } } } } } } 结果: