首页 / 知识
关于delphi:对数组进行排序的最佳方法
2023-04-14 01:53:00

Best way to sort an array说我有一个记录数组,我想根据记录中的一个字段对它们进行排序。实现此目标的最佳方法是什么?
您可以将指向数组元素的指针添加到 但是,如果您使用的是下一版本D2009,则有一个新的collections库,可以对数组进行排序。对于自定义排序顺序,它需要一个可选的
(我知道这是一年后的事,但仍然有用。) Skamradt关于填充整数值的建议假设您要使用字符串比较进行排序。这会很慢。每次插入都会调用format(),但速度较慢。相反,您想进行整数比较。 您从记录类型开始:
您没有说明记录的存储方式,或排序后想要访问的方式。因此,假设您将它们放入动态数组中:
现在,您要按整数值SortOrder对该数组进行排序。如果要使用的是TStringList(因此可以使用ts.Find方法),则应将每个字符串添加到列表中,并将SortOrder作为指针添加。然后按指针排序:
请注意将Integer SortOrder转换为TObject指针的技巧,该指针存储在TStringList.Object属性中。 (这取决于整数和指针大小相同的事实。)我们必须在某个地方定义一个函数来比较TObject指针:
现在,我们可以通过调用.CustomSort而不是.Sort来对.Object上的tsList进行排序(它将对字符串值进行排序。)
现在已对TStringList进行排序,因此您可以将其从0迭代到.Count-1并按排序顺序读取字符串。 但是假设您不想要TStringList,而只想要按排序顺序的数组。或者,在此示例中,记录包含的数据不仅仅是一个字符串,而且您的排序顺序更加复杂。您可以跳过添加每个字符串的步骤,只需将数组索引添加为TList中的Items。除了使用TList代替TStringList以外,以相同的方式执行上述所有操作:
现在Mlist已排序,将其用作查找表以按排序顺序访问数组:
当我遍历TList时,我们以排序的顺序取回数组索引。我们只需要将它们强制转换回整数,因为TList认为它们是指针。 我喜欢这样,但是您也可以通过添加数组元素的地址而不是其索引,在TList中将实际指针放置到TList中。然后,要使用它们,可以将它们转换为TExample记录的指针。这是Barry Kelly和CoolMagic在回答中说的。 如果您需要按字符串排序,请使用排序后的 但是如果需要按整数字段和字符串排序-使用 这全部取决于您要排序的记录数。如果您只排序不到几百种,那么其他排序方法也可以正常工作;如果您要进行更多排序,那么请仔细看一下旧的可信赖的Turbo Power SysTools项目。源代码中包含一个非常好的排序算法。一个很好的工具,可以高效地对数百万条记录进行排序。 如果要使用tStringList方法对记录列表进行排序,请在将整数插入列表之前确保将其整数填充到右边。例如,您可以使用格式(\\'%。10d \\',[rec.sortorder])右对齐至10位数字。 当需要快速排序时,通常使用快速排序算法。例如,Delphi正在(或曾经)将其用于List.Sort。 因此,轻松快速地对结构数组排序的一种替代方法可能是使用msvcrt.dll中的qsort C运行时函数。 这是一个可能不错的声明(警告:仅在Windows上可移植的代码)。
此处是完整示例。 请注意,如果记录很大,则直接对记录数组进行排序可能会很慢。在这种情况下,对指向记录的指针数组进行排序会更快(类似于List方法)。 对于数组,我将使用 基于C的例程,这里有几个 另一个站点,但是有pascal来源 如果您使用的是Delphi XE2或更高版本,则可以尝试:
注意:为了提高速度,请在未排序的 致谢。 使用Wikipedia提议的一种排序规则。交换函数应使用与数组元素相同类型的临时变量交换数组元素。如果希望具有相同SortOrder整数值的条目保持在第一位的顺序,请使用稳定的排序。 我创建了一个非常简单的示例,如果排序字段是字符串,该示例将正常工作。
|
最新内容
相关内容
linuxls命令排序?
linuxls命令排序?,工作,系统,信息,数据,命令,目录,标准,基础,管理,时间,Linux列出当前目录下的文件和目录用什么命令在Linux系统中,使用ls命令linux提取字段串命令?
linux提取字段串命令?,数字,字符串,状态,工具,命令,文件,范本,样式,正则,字段,linux如何获取两个字符串之间的内容?1、在 Linux 中,您可以使用linux排序数字命令?
linux排序数字命令?,标准,数字,单位,情况,系统,信息,命令,文件,顺序,参数,linux下用shell编写,键盘输入三个数,按大小排序输出1、这个问题可以linuxll排序命令?
linuxll排序命令?,系统,信息,地址,标准,工作,命令,时间,数据,文件,目录,Linux列出当前目录下的文件和目录用什么命令1、linux系统下用ls命令列linux创建数组命令?
linux创建数组命令?,地址,工作,系统,信息,命令,代码,目录,情况,标准,文件,Linux命令linux系统常用操作命令如下:ls:全拼list,功能是列出目录的内linux命令按大小排序?
linux命令按大小排序?,数字,地址,时间,工作,标准,系统,命令,信息,单位,软件,linuxsort命令列表从大到小排序完如何保存Linux sort命令参数:-b:忽linux计数排序命令?
linux计数排序命令?,标准,命令,情况,工作,文件,系统,数字,管理,目录,内容,Linux文本处理命令的Sort命令sort命令的语法格式:sort[参数][文件]Lilinux下排序命令怎么?
linux下排序命令怎么?,本行,命令,代码,数字,位置,单位,标准,文件,参数,文本,linux下uniq和sort命令用法详解,对文本操作时,它一般会和sort命令进linux按字符排序命令?
linux按字符排序命令?,标准,命令,时间,情况,文件,数字,基础,状态,系统,功能,image_files.sort()用法1、CMD命令即命令提示符,CMD是command的缩linux字典排序命令?
linux字典排序命令?,工作,系统,标准,信息,命令,时间,数字,单位,状态,软件,Linux如何对文件ABC分别按字典顺序,月份顺序,算数值进行排序将排序linux命令输入方法?
linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,linux终端输入~怎么弄中间在电脑上打开需要的Word文件进入。进入到文Python中什么是反射?使用方法有哪
Python中什么是反射?使用方法有哪些?,信息,培训,状态,术语,检测,反射,属性,对象,字符串,方法,反射这个术语在很多语言中都存在,并且存在大量的