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

标签 arrays delphi sorting

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

我有一组数组

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/

相关文章:

algorithm - 二分搜索+排序与线性搜索(大O)

java - 为什么这个处理代码会产生逐渐减少的痕迹?

c - 如何有效地消除 double 数组中的重复元素(在 C 中)?

delphi - 在 DLL 中填充 TStringList

multithreading - Delphi:FormStyle:fsStayOnTop.InputQuery 在线程中并且位于表单后面

c++ - 流行的 C++ 编译器对 std::sort 和 std::stable_sort 使用什么算法?

jquery - 默认二级排序

javascript - SQLSTATE[01000] : Warning: 1265 Data truncated for column 'id_paket' at row 1

ios - Swift 3 Array,一次删除多个项目,使用 .remove(at : i)

delphi - 在运行时从 Delphi TDBGrid 后代显示 DBGrid 之前,如何以编程方式更改 TColumn 属性?