c# 快速排序法并记录数组索引
在遗传算法中,只需要对适应性函数评分进行排序,没必要对所有的个体也参与排序,因为在适应性函数评分排序是可以纪律下最初的索引,排序后的索引随着元素排序而变动,这样就知道那个评分对应那个个体了:
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# 快速排序法并记录数组索引的更多相关文章
- C#实现快速排序法
现在有数组{ 3, 6, 2, 1, 9, 5, 4, 7 }; 然后用快速排序法把他们排序 1.首先 ,取出3作为比较数据 2.从最右边往左边比较找到第一个比3小的数据,把3在数组中的位置赋值为那个 ...
- c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法
本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...
- v8--sort 方法 源码 (2) 快速排序法
v8 sort方法部分关于快速排序法的源码: function QuickSort(a, from, to) { // Insertion sort is faster for short array ...
- php四种基础算法:冒泡,选择,插入和快速排序法
转自:http://www.php100.com/html/php/rumen/2013/1029/6333.html 许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一 ...
- php 四种基础算法 ---- 快速排序法
4.快速排序法 代码: function quick_sort($arr) { //先判断是否需要继续进行 $length = count($arr); if($length < ...
- 数据结构-栈(应用篇)之快速排序法-C和C++的实现
一.原理解析 快速排序法: 基本思路是,从第一个元素开始,把所有比它大的元素放在它后面,把所有比它小的元素放前面.然后划分它前面和后面的所有元素,分别再做快速排序,直到无法再划分为止. 在以下程序案例 ...
- Java 快速排序法 冒泡排序法 选择排序法 插入排序法
1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...
- javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...
- php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法
这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...
随机推荐
- 自学之jQuery
最近在公司做项目的过程中,涉及到写前端部分,因为之前一直很少写前端,所以不是很熟悉,所以,在此写一下自学jQuery的过程,以及中途遇到的坑. 首先,要想使用jQuery必须先引入jQuery < ...
- 弹框alertView
// 创建一个弹框UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@“标题” message:@“显示的具体内容” delegate:s ...
- Excel怎么下拉框多选
打开Exlce, 确定,然后 右击查看代码,把这段代码复制到新建的文件里面 此时Excel会给出提示,选择否,,系统会提示保存,在保存的时候选择启用宏的工作簿然后保存,此时Excel下拉框多选就搞定了 ...
- ABP框架使用Swagger
参考文档:https://www.cnblogs.com/xcsn/p/7910890.html 步骤1:Nuget安装Swashbuckle到*.WebApi项目 步骤2:在*.WebApi> ...
- easyrules
http://www.easyrules.org/tutorials/hello-world-tutorial.html
- Three.js粒子特效,shader渲染初探(一篇非常详细的介绍)
Three.js粒子特效,shader渲染初探 转载来源:https://juejin.im/post/5b0ace63f265da0db479270a 这大概是个序 关于Three.js,网上有不多 ...
- linq 动态判断
以前要不是使用扩展方法 要么使用如(t==2&&判断条件)||(s==1&&判断条件) 其实可以简单的实现扩展一个whereIf即可(abp实现),如下所示 ··· / ...
- c#dev tabcontrol 切换页面时注意的问题
先加一个代码 public void SetXtraTabPageVisible(DevExpress.XtraTab.XtraTabControl xtraTabControl, bool iIsV ...
- Taxi
/* After the lessons n groups of schoolchildren went outside and decided to visit Polycarpus to cele ...
- linux学习第四天 (Linux就该这么学)2018年11月16日
今天主要讲了 管道符,重写向与环境变量 输入输出重写向 标准输出重写向 (标准,覆盖,错误) > 将标准输出重写向到一个文件中 >> 追加到文件 2>错误输出重定向 2> ...