gpt4 book ai didi

arrays - 对数组进行排序并在Delphi中获取索引

转载 作者:行者123 更新时间:2023-12-03 18:57:11 24 4
gpt4 key购买 nike

我有一个小难题,这让我头疼,应该很有趣。

我有一组数组

arrayX : array of real;
arrayY : array of real;


代表多个点x,y,使得(arrayX [0],arrayY [0])构成一个点。
现在,我想相对于X对这些数组进行排序,并且我认为方法必须是通过arrayX获取排序索引的列表并将其应用于两个数组,这会引起我的问​​题:

如何编写一个函数给我arrayX的排序索引(升序),最好是整数数组? ArrayX可以保存重复值

最佳答案

我假设您的代码中已经具有排序功能,并且不会尝试在此处解释如何排序。 RTL为此提供了TArray.Sort<T>

而不是对值进行排序,而是对索引进行排序。添加一个间接级别。


创建一个整数数组Indices,其中包含索引0、1,...,N-1。
排序此整数数组。
当比较索引数组中的两个值L和R时,而不是比较L和R,请比较X[L]X[R]


因此,为了扩展到最后一点,在对整数进行排序时,一个标准的比较函数如下所示:

function Compare(L, R: Integer): Integer;
begin
if L<R then
Result := -1
else if L>R then
Result := 1
else
Result := 0;
end;


但是,您可以在此时应用间接:

function Compare(L, R: Integer): Integer;
begin
if X[L]<X[R] then
Result := -1
else if X[L]>X[R] then
Result := 1
else
Result := 0;
end;


在此过程结束时,您将拥有索引,这些索引可以告诉您点的顺序。第一点是:

X[Indices[i]], Y[Indices[i]]


此技术称为间接排序。



您出现的问题确实暗示您可能没有正确定义数据结构。代替两个不同的数组(一个包含X坐标,一个包含Y坐标),似乎更适合存储一个点数组:

type
TPoint = record
X: Real;
Y: Real;
end;

var
Points: array of TPoint;


现在,您可以通过按 Points值排序来排序 X,但是交换整个点。当您以这种方式表示数据时,坐标就不会混乱。并且 X坐标永远不会与其匹配的 Y坐标分开。

关于arrays - 对数组进行排序并在Delphi中获取索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25684015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com