你如何在Forth中对整数数组进行排序?

时间:2014-06-06 22:38:30

标签: arrays sorting forth

我有一个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修正了数组定义。

1 个答案:

答案 0 :(得分:3)

你对ARRAY的定义是错误的:

does> cells + ;

在DOES> ,数组的地址位于堆栈顶部,索引(例如, 3)中的3 atod低于它。所以你的CELLS在地址上运行,即 一个非常无意义的操作,然后将结果添加到3。通过 惯例,在DOES中忽略地址>堆栈图片,自堆栈 图片适用于单词的用户。但地址就在那里。

正确,

: array ( n "name" -- )
  create  cells allot
  does> ( index -- addr ) swap cells + ;

你可以像对待任何东西一样排序。真的,有一个整体 排序操作的文献,所有这些都适用于Forth。 所以quicksortinsertion sortbogosort,无论如何,你都可以做到 在福斯。

列出了大量的排序示例

http://rosettacode.org/wiki/Category:Forth

Quicksort是一种破坏性的(你不关心原始订单) 就地(你不想分配一堆额外的内存)排序 符合您的标准。 Rosetta Code有一个Forth实现 这里:

http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Forth

(该代码推迟了LESSTHAN,因为快速实施通常会执行 其他语言,但Forth代码有更多的地方 关于其他语言通常的数据类型的假设 会有,所以推迟LESSTHAN是不够的 通用排序。)