C#,数值计算——索引类(Index)的计算方法与源程序

using System;

namespace Legalsoft.Truffer

{

public class Indexx

{

public int n { get; set; } = 0;

public int[] indx;

public Indexx()

{

}

public Indexx(double[] arr)

{

index(arr, arr.Length);

}

public void sort(double[] brr)

{

if (brr.Length != n)

{

throw new Exception("bad size in Index sort");

}

double[] tmp = Globals.CopyFrom(brr);

for (int j = 0; j < n; j++)

{

brr[j] = tmp[indx[j]];

}

}

public void sort(int[] brr)

{

if (brr.Length != n)

{

throw new Exception("bad size in Index sort");

}

int[] tmp = Globals.CopyFrom(brr);

for (int j = 0; j < n; j++)

{

brr[j] = tmp[indx[j]];

}

}

public double el(double[] brr, int j)

{

return brr[indx[j]];

}

public int el(int[] brr, int j)

{

return brr[indx[j]];

}

public void setEl(int[] brr, int j, int v)

{

brr[indx[j]] = v;

}

public void setEl(double[] brr, int j, double v)

{

brr[indx[j]] = v;

}

public void rank(int[] irank)

{

irank = new int[n];

for (int j = 0; j < n; j++)

{

irank[indx[j]] = j;

}

}

public void index(double[] arr, int nn)

{

const int M = 7;

const int NSTACK = 64;

int jstack = -1;

int[] istack = new int[NSTACK];

n = nn;

indx = new int[n];

int ir = n - 1;

for (int j = 0; j < n; j++)

{

indx[j] = j;

}

int l = 0;

for (; ; )

{

if (ir - l < M)

{

for (int j = l + 1; j <= ir; j++)

{

int indxt = indx[j];

double a = arr[indxt];

int i = j - 1;

for (; i >= l; i--)

{

if (arr[indx[i]] <= a)

{

break;

}

indx[i + 1] = indx[i];

}

indx[i + 1] = indxt;

}

if (jstack < 0)

{

break;

}

ir = istack[jstack--];

l = istack[jstack--];

}

else

{

int k = (l + ir) >> 1;

Globals.SWAP(ref indx[k], ref indx[l + 1]);

if (arr[indx[l]] > arr[indx[ir]])

{

Globals.SWAP(ref indx[l], ref indx[ir]);

}

if (arr[indx[l + 1]] > arr[indx[ir]])

{

Globals.SWAP(ref indx[l + 1], ref indx[ir]);

}

if (arr[indx[l]] > arr[indx[l + 1]])

{

Globals.SWAP(ref indx[l], ref indx[l + 1]);

}

int i = l + 1;

int j = ir;

int indxt = indx[l + 1];

double a = arr[indxt];

for (; ; )

{

do

{

i++;

} while (arr[indx[i]] < a);

do

{

j--;

} while (arr[indx[j]] > a);

if (j < i)

{

break;

}

Globals.SWAP(ref indx[i], ref indx[j]);

}

indx[l + 1] = indx[j];

indx[j] = indxt;

jstack += 2;

if (jstack >= NSTACK)

{

throw new Exception("NSTACK too small in index.");

}

if (ir - i + 1 >= j - l)

{

istack[jstack] = ir;

istack[jstack - 1] = i;

ir = j - 1;

}

else

{

istack[jstack] = j - 1;

istack[jstack - 1] = l;

l = i;

}

}

}

}

}

}

相关推荐
艾莉丝努力练剑5 分钟前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
ZZZS051614 分钟前
stack栈练习
c++·笔记·学习·算法·动态规划
hans汉斯40 分钟前
【人工智能与机器人研究】基于力传感器坐标系预标定的重力补偿算法
人工智能·算法·机器人·信号处理·深度神经网络
witton2 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
vortex52 小时前
算法设计与分析:分治、动态规划与贪心算法的异同与选择
算法·贪心算法·动态规划
枯萎穿心攻击2 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
Jerry Lau2 小时前
go go go 出发咯 - go web开发入门系列(一) helloworld
开发语言·前端·golang
nananaij2 小时前
【Python基础入门 re模块实现正则表达式操作】
开发语言·python·正则表达式
Micro麦可乐2 小时前
Java常用加密算法详解与实战代码 - 附可直接运行的测试示例
java·开发语言·加密算法·aes加解密·rsa加解密·hash算法
天下一般2 小时前
go入门 - day1 - 环境搭建
开发语言·后端·golang