我有一个100个元素的整数数组。我们假设它使用this definition for 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修正了数组定义。
答案 0 :(得分:3)
你对ARRAY的定义是错误的:
does> cells + ;
在DOES> ,数组的地址位于堆栈顶部,索引(例如,
3
)中的3 atod
低于它。所以你的CELLS在地址上运行,即
一个非常无意义的操作,然后将结果添加到3
。通过
惯例,在DOES中忽略地址>堆栈图片,自堆栈
图片适用于单词的用户。但地址就在那里。
正确,
: array ( n "name" -- )
create cells allot
does> ( index -- addr ) swap cells + ;
你可以像对待任何东西一样排序。真的,有一个整体 排序操作的文献,所有这些都适用于Forth。 所以quicksort,insertion sort,bogosort,无论如何,你都可以做到 在福斯。
列出了大量的排序示例
http://rosettacode.org/wiki/Category:Forth
Quicksort是一种破坏性的(你不关心原始订单) 就地(你不想分配一堆额外的内存)排序 符合您的标准。 Rosetta Code有一个Forth实现 这里:
http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Forth
(该代码推迟了LESSTHAN,因为快速实施通常会执行 其他语言,但Forth代码有更多的地方 关于其他语言通常的数据类型的假设 会有,所以推迟LESSTHAN是不够的 通用排序。)