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

 using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1arraysort
{
class Program
{
static void Main(string[] args)
{
int[] arr2 = new int[] {,,,,,,,,, };
List<int> mylist=new List<int> ();
mylist =arr2.ToList();
int [] indexArr=new int[arr2.Length];
for (int i = ; i < indexArr.Length ; i++)
{
indexArr[i] = i;
} QuickSortClass qs = new QuickSortClass();
qs.QuickSort(mylist, , mylist.Count-,indexArr ); } //http://www.jb51.net/article/86442.htm
public class QuickSortClass
{
public int Division(List<int> list, int left, int right,int[] mindexArr)
{
//首先挑选一个基准元素
int baseNum = list[left];
int baseIndex = mindexArr[left];
while (left < right)
{
//从数组的右端开始向前找,一直找到比base小的数字为止(包括base同等数)
while (left < right && list[right] >= baseNum)
right = right - ;
//最终找到了比baseNum小的元素,要做的事情就是此元素放到base的位置
list[left] = list[right];
mindexArr[left] = mindexArr[right];
//从数组的左端开始向后找,一直找到比base大的数字为止(包括base同等数)
while (left < right && list[left] <= baseNum)
left = left + ;
//最终找到了比baseNum大的元素,要做的事情就是将此元素放到最后的位置
list[right] = list[left];
mindexArr[right] = mindexArr[left];
}
//最后就是把baseNum放到该left的位置
list[left] = baseNum;
mindexArr[left] = baseIndex;
//最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大
//至此,我们完成了第一篇排序
return left;
} public void QuickSort(List<int> list, int left, int right, int[] mindexArr)
{
//左下标一定小于右下标,否则就超越了
if (left < right)
{
//对数组进行分割,取出下次分割的基准标号
int i = Division(list, left, right,mindexArr); //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
QuickSort(list, left, i - , mindexArr); //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
QuickSort(list, i + , right, mindexArr);
}
}
} }
}

评价函数排序

修改,使之输入为数组而不是list:

 using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1arraysort
{
class Program
{
static void Main(string[] args)
{
double[] arr2 = new double[] { , , , , , , , , , };
int [] indexArr=new int[arr2.Length];
for (int i = ; i < indexArr.Length ; i++)
{
indexArr[i] = i;
} QuickSortClass qs = new QuickSortClass();
qs.QuickSort(arr2, , arr2.Length - , indexArr);
} //http://www.jb51.net/article/86442.htm
public class QuickSortClass
{
public int Division(double[] list, int left, int right,int[] mindexArr)
{
//首先挑选一个基准元素
double baseNum = list[left];
int baseIndex = mindexArr[left];
while (left < right)
{
//从数组的右端开始向前找,一直找到比base小的数字为止(包括base同等数)
while (left < right && list[right] >= baseNum)
right = right - ;
//最终找到了比baseNum小的元素,要做的事情就是此元素放到base的位置
list[left] = list[right];
mindexArr[left] = mindexArr[right];
//从数组的左端开始向后找,一直找到比base大的数字为止(包括base同等数)
while (left < right && list[left] <= baseNum)
left = left + ;
//最终找到了比baseNum大的元素,要做的事情就是将此元素放到最后的位置
list[right] = list[left];
mindexArr[right] = mindexArr[left];
}
//最后就是把baseNum放到该left的位置
list[left] = baseNum;
mindexArr[left] = baseIndex;
//最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大
//至此,我们完成了第一篇排序
return left;
} public void QuickSort(double[] list, int left, int right, int[] mindexArr)
{
//左下标一定小于右下标,否则就超越了
if (left < right)
{
//对数组进行分割,取出下次分割的基准标号
int i = Division(list, left, right,mindexArr); //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
QuickSort(list, left, i - , mindexArr); //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
QuickSort(list, i + , right, mindexArr);
}
}
} }
}

数组快速排序并记录索引


list比较是还是得用单个元素,不能一条一条的比较啊:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1Listadd
{
class Program
{
static void Main(string[] args)
{
List<List<double>> twoDimeList = new List<List<double>>();
for (int j = ; j < ; j++)
{
List<double> oneDimeList = new List<double>();
for (int i = ; i < ; i++)
{
oneDimeList.Add(i+j);
}
twoDimeList.Add(oneDimeList);
}
twoDimeList.Add(new List<double> { 1.0,2.0,3.0});
Console.WriteLine(twoDimeList.Count);//输出行数
Console.WriteLine(twoDimeList[][]);
Console.WriteLine(twoDimeList[]==twoDimeList[twoDimeList .Count-]); }
}
}

list的创建和比较


c# 快速排序法并记录数组索引的更多相关文章

  1. C#实现快速排序法

    现在有数组{ 3, 6, 2, 1, 9, 5, 4, 7 }; 然后用快速排序法把他们排序 1.首先 ,取出3作为比较数据 2.从最右边往左边比较找到第一个比3小的数据,把3在数组中的位置赋值为那个 ...

  2. c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法

    本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...

  3. v8--sort 方法 源码 (2) 快速排序法

    v8 sort方法部分关于快速排序法的源码: function QuickSort(a, from, to) { // Insertion sort is faster for short array ...

  4. php四种基础算法:冒泡,选择,插入和快速排序法

    转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...

  5. php 四种基础算法 ---- 快速排序法

    4.快速排序法 代码: function quick_sort($arr) {    //先判断是否需要继续进行    $length = count($arr);    if($length < ...

  6. 数据结构-栈(应用篇)之快速排序法-C和C++的实现

    一.原理解析 快速排序法: 基本思路是,从第一个元素开始,把所有比它大的元素放在它后面,把所有比它小的元素放前面.然后划分它前面和后面的所有元素,分别再做快速排序,直到无法再划分为止. 在以下程序案例 ...

  7. Java 快速排序法 冒泡排序法 选择排序法 插入排序法

    1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...

  8. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  9. php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

    这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...

随机推荐

  1. day 23 网络编程

    C/S架构 Client与Server B/S架构 Browser与Server windows上查看端口占用情况 netstat -a OSI七层模型: 其他略...

  2. Runnable如何传参

    private class TimerUpdateTask implements Runnable{ private boolean isUnion = false; public TimerUpda ...

  3. cgi fast-cgi php-fpm区别

    php-cli 是php在系统执行的程序,直接执行php文件: cgi和fast-cgi的区别1.cgi和fast-cgi都是php解析协议,负责解析服务器分发过来的php动态文件:cgi程序就会去解 ...

  4. Struts2框架之Action类的访问

    1. 通过<action>标签中的method属性,访问到Action中的具体的方法. * 传统的配置方式,配置更清晰更好理解!但是扩展需要修改配置文件等! * 具体的实例如下: * 页面 ...

  5. 深入理解HTTP协议及原理分析

    1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和 ...

  6. Service Broker 概述

    ServiceBroker(简称SSB)是基于数据库引擎提供的一个强大的异步编程模型,通过ServiceBroker,开发人员无需编写复杂的通信和消息程序,即可在数据库实例之间完成高效可靠的异步通信. ...

  7. 使用Maven插件快捷打包发布远程Docker镜像 dockerfile-maven-plugin

    1.开放远程Docker远程访问端口 # vim /lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0. ...

  8. (转)关于X64位系统IIS7下支持32位asp.net程序

    最近在windows2008 x64位系统下的IIS7下部署asp.net程序. vs2005或vs2008默认的情况下是Any cpu 的也就是支持x86和x64两种系统的.可我的程序在引用了一个三 ...

  9. 常用的TCP Option

    当前,TCP常用的Option如下所示———— Kind (Type) Length Name Reference 描述 & 用途 0 1 EOL RFC 793 选项列表结束 1 1 NOP ...

  10. Site.ForProductsOfApple

    1. cultofmac http://www.cultofmac.com/ 2. imore http://www.imore.com/ 3. osxdaily http://osxdaily.co ...