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;

}

}

}

}

}

}

相关推荐
郝学胜-神的一滴26 分钟前
现代OpenGL窗口管理:GLFW从入门到实战
开发语言·c++·程序人生·图形渲染·个人开发
ゞ 正在缓冲99%…1 小时前
2025.9.28华为软开
算法·华为
谁刺我心1 小时前
C++三种智能指针unique、shared、weak
开发语言·c++
9ilk1 小时前
【C++】 --- 哈希
c++·后端·算法·哈希算法
AGANCUDA1 小时前
qt使用osg显示pcd点云的例子
开发语言·qt
2301_815686451 小时前
extern
java·开发语言
报错小能手1 小时前
数据结构 定长顺序表
数据结构·c++
q***56381 小时前
Java进阶-SPI机制
java·开发语言
合作小小程序员小小店1 小时前
桌面开发,在线%物品代送,代接管理%系统,基于vs2022,c#,winform,sql server数据。
开发语言·数据库·sql·microsoft·c#
g***B7382 小时前
Rust在网络中的Tokio
开发语言·网络·rust