我有一个100个元素的整数数组。假设它对array使用此定义:
: array ( n "name" -- )
create cells allot
does> ( index -- addr ) swap cells + ;
100 array atod \ Make an array with 100 cells
3 atod \ Return address of fourth element
现在,假设此atod
数组已填充有从ATOD输入读取的100个整数值。在处理它之前,我想使用同一atod
数组按值对整数进行永久排序。也就是说,我不在乎原始顺序,我只是在乎它们是否已排序,并且我的内存很小,因此,我宁愿不定义任何其他变量或数组。
您如何排序?
编辑:根据@Julian Fondren修复了数组定义。
您对ARRAY的定义是错误的:
does> cells + ;
在DOES>处,数组的地址在堆栈的顶部,索引(例如3
中的3 atod
)在堆栈的下面。因此,您的CELLS在该地址上进行操作,这是一个毫无意义的操作,然后将结果添加到3
。按照惯例,在DOES>堆栈图片中将忽略该地址,因为堆栈图片是供单词用户使用的。但是地址在那里。
正确地,
: array ( n "name" -- )
create cells allot
does> ( index -- addr ) swap cells + ;
就像对任何东西进行排序一样,对它进行排序。确实,有整本分类操作的文献,所有这些都适用于Forth。所以快速排序,插入排序,BOGO排序,随便,你可以在第四做到这一点。
列出了一大堆排序示例
http://rosettacode.org/wiki/类别:Forth
Quicksort是一种符合您条件的破坏性(您不关心原始顺序)的就地(您不想分配额外的内存)排序。Rosetta Code在此处具有Forth实现:
http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Forth
(该代码使LESSTHAN像通常在其他语言中实现的快速排序实现一样受阻,但是Forth代码在更多地方可以假定其他语言通常具有的数据类型,因此推迟LESSTHAN不足以进行通用排序。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句