在遗传算法中,只需要对适应性函数评分进行排序,没必要对所有的个体也参与排序,因为在适应性函数评分排序是可以纪律下最初的索引,排序后的索引随着元素排序而变动,这样就知道那个评分对应那个个体了:
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ConsoleApplication1arraysort 9 {10 class Program11 {12 static void Main(string[] args)13 {14 int[] arr2 = new int[] { 72,6,57,88,60,42,83,73,48,85 };15 List mylist=new List ();16 mylist =arr2.ToList();17 int [] indexArr=new int[arr2.Length];18 for (int i = 0; i < indexArr.Length ; i++)19 {20 indexArr[i] = i;21 }22 23 QuickSortClass qs = new QuickSortClass();24 qs.QuickSort(mylist, 0, mylist.Count-1,indexArr );25 26 27 }28 29 //http://www.jb51.net/article/86442.htm30 public class QuickSortClass31 {32 public int Division(List list, int left, int right,int[] mindexArr)33 {34 //首先挑选一个基准元素35 int baseNum = list[left];36 int baseIndex = mindexArr[left];37 while (left < right)38 {39 //从数组的右端开始向前找,一直找到比base小的数字为止(包括base同等数)40 while (left < right && list[right] >= baseNum)41 right = right - 1;42 //最终找到了比baseNum小的元素,要做的事情就是此元素放到base的位置43 list[left] = list[right];44 mindexArr[left] = mindexArr[right];45 //从数组的左端开始向后找,一直找到比base大的数字为止(包括base同等数)46 while (left < right && list[left] <= baseNum)47 left = left + 1;48 //最终找到了比baseNum大的元素,要做的事情就是将此元素放到最后的位置49 list[right] = list[left];50 mindexArr[right] = mindexArr[left];51 }52 //最后就是把baseNum放到该left的位置53 list[left] = baseNum;54 mindexArr[left] = baseIndex;55 //最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大56 //至此,我们完成了第一篇排序57 return left;58 }59 60 public void QuickSort(List list, int left, int right, int[] mindexArr)61 {62 //左下标一定小于右下标,否则就超越了63 if (left < right)64 {65 //对数组进行分割,取出下次分割的基准标号66 int i = Division(list, left, right,mindexArr);67 68 //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序69 QuickSort(list, left, i - 1, mindexArr);70 71 //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序72 QuickSort(list, i + 1, right, mindexArr);73 }74 }75 }76 77 78 79 80 81 82 }83 }
修改,使之输入为数组而不是list:
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ConsoleApplication1arraysort 9 {10 class Program11 {12 static void Main(string[] args)13 {14 double[] arr2 = new double[] { 72, 6, 57, 88, 60, 42, 83, 73, 48, 85 }; 15 int [] indexArr=new int[arr2.Length];16 for (int i = 0; i < indexArr.Length ; i++)17 {18 indexArr[i] = i;19 }20 21 QuickSortClass qs = new QuickSortClass();22 qs.QuickSort(arr2, 0, arr2.Length - 1, indexArr);23 }24 25 //http://www.jb51.net/article/86442.htm26 public class QuickSortClass27 {28 public int Division(double[] list, int left, int right,int[] mindexArr)29 {30 //首先挑选一个基准元素31 double baseNum = list[left];32 int baseIndex = mindexArr[left];33 while (left < right)34 {35 //从数组的右端开始向前找,一直找到比base小的数字为止(包括base同等数)36 while (left < right && list[right] >= baseNum)37 right = right - 1;38 //最终找到了比baseNum小的元素,要做的事情就是此元素放到base的位置39 list[left] = list[right];40 mindexArr[left] = mindexArr[right];41 //从数组的左端开始向后找,一直找到比base大的数字为止(包括base同等数)42 while (left < right && list[left] <= baseNum)43 left = left + 1;44 //最终找到了比baseNum大的元素,要做的事情就是将此元素放到最后的位置45 list[right] = list[left];46 mindexArr[right] = mindexArr[left];47 }48 //最后就是把baseNum放到该left的位置49 list[left] = baseNum;50 mindexArr[left] = baseIndex;51 //最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大52 //至此,我们完成了第一篇排序53 return left;54 }55 56 public void QuickSort(double[] list, int left, int right, int[] mindexArr)57 {58 //左下标一定小于右下标,否则就超越了59 if (left < right)60 {61 //对数组进行分割,取出下次分割的基准标号62 int i = Division(list, left, right,mindexArr);63 64 //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序65 QuickSort(list, left, i - 1, mindexArr);66 67 //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序68 QuickSort(list, i + 1, right, mindexArr);69 }70 }71 }72 73 74 75 76 77 78 }79 }
list比较是还是得用单个元素,不能一条一条的比较啊:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApplication1Listadd 8 { 9 class Program10 {11 static void Main(string[] args)12 {13 List
> twoDimeList = new List
>(); 14 for (int j = 0; j < 4; j++)15 {16 List oneDimeList = new List (); 17 for (int i = 0; i < 3; i++)18 { 19 oneDimeList.Add(i+j);20 }21 twoDimeList.Add(oneDimeList);22 }23 twoDimeList.Add(new List { 1.0,2.0,3.0});24 Console.WriteLine(twoDimeList.Count);//输出行数25 Console.WriteLine(twoDimeList[1][1]);26 Console.WriteLine(twoDimeList[1]==twoDimeList[twoDimeList .Count-1]);27 28 }29 }30 }