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;

}

}

}

}

}

}

相关推荐
No0d1es2 分钟前
CCF GESP C++编程 五级认证真题 2025年3月
开发语言·c++·青少年编程·gesp·ccf·五级·2025年3月
独好紫罗兰11 分钟前
洛谷题单3-P1217 [USACO1.5] 回文质数 Prime Palindromes-python-流程图重构
开发语言·python·算法
独好紫罗兰17 分钟前
洛谷题单2-P1424 小鱼的航程(改进版)-python-流程图重构
开发语言·python·算法
加瓦点灯1 小时前
观察者模式:解耦对象间的依赖关系
开发语言·javascript·观察者模式
愚润求学1 小时前
Linux开发工具——apt
linux·服务器·开发语言
程序员小赵同学1 小时前
AI Agent设计模式二:Parallelization
开发语言·python·设计模式
时光话1 小时前
Lua:第1-4部分 语言基础
开发语言·lua
欧宸雅1 小时前
Clojure语言的持续集成
开发语言·后端·golang
qystca1 小时前
蓝桥云客---九宫幻方
算法·深度优先·图论
胡斌附体1 小时前
qt tcpsocket编程遇到的并发问题
开发语言·网络·qt·并发编程·tcpsocket