• c# 快速排序法并记录数组索引


    在遗传算法中,只需要对适应性函数评分进行排序,没必要对所有的个体也参与排序,因为在适应性函数评分排序是可以纪律下最初的索引,排序后的索引随着元素排序而变动,这样就知道那个评分对应那个个体了:

     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的创建和比较


  • 相关阅读:
    python爬取哦漫画
    NLP系列(2)_用朴素贝叶斯进行文本分类(上)
    svm 笔记
    nlp学习笔记
    LR
    bp网络全解读
    最小二乘法
    学习参考
    pandas中的quantile函数
    泰坦尼克号与小费与乘客数量与 鸢尾花数据集
  • 原文地址:https://www.cnblogs.com/zhubinglong/p/8351669.html
Copyright © 2020-2023  润新知