在遗传算法中,只需要对适应性函数评分进行排序,没必要对所有的个体也参与排序,因为在适应性函数评分排序是可以纪律下最初的索引,排序后的索引随着元素排序而变动,这样就知道那个评分对应那个个体了:
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 Program
11 {
12 static void Main(string[] args)
13 {
14 int[] arr2 = new int[] {72,6,57,88,60,42,83,73,48,85 };
15 List<int> mylist=new List<int> ();
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.htm
30 public class QuickSortClass
31 {
32 public int Division(List<int> 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<int> 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 Program
11 {
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.htm
26 public class QuickSortClass
27 {
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 Program
10 {
11 static void Main(string[] args)
12 {
13 List<List<double>> twoDimeList = new List<List<double>>();
14 for (int j = 0; j < 4; j++)
15 {
16 List<double> oneDimeList = new List<double>();
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<double> { 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 }
list的创建和比较