Sorting 如何在smalltalk中创建排序方法
我正在尝试在smalltalk中创建一种新的排序方法。有人知道如何将这个排序java代码更改为squeak吗Sorting 如何在smalltalk中创建排序方法,sorting,methods,smalltalk,squeak,Sorting,Methods,Smalltalk,Squeak,我正在尝试在smalltalk中创建一种新的排序方法。有人知道如何将这个排序java代码更改为squeak吗 public static void SelectionSort ( int [ ] num ) { int i, j, first, temp; for ( i = num.length - 1; i > 0; i - - ) { first = 0; //initialize to subscript of firs
public static void SelectionSort ( int [ ] num )
{
int i, j, first, temp;
for ( i = num.length - 1; i > 0; i - - )
{
first = 0; //initialize to subscript of first element
for(j = 1; j <= i; j ++) //locate smallest element between positions 1 and i.
{
if( num[j] < num[first] )
first = j;
}
temp = num[first]; //swap smallest found with element in position i.
num[first] = num[ i ];
num[i] = temp;
}
}
publicstaticvoidselectionsort(int[]num)
{
int i,j,第一,温度;
对于(i=num.length-1;i>0;i---)
{
first=0;//初始化为第一个元素的下标
对于(j=1;j简短回答:
你不必这么做
要对数组进行排序,只需向其发送消息#schordedcollection
。例如,在工作区中检查此项:
#(7 2 8 5) asSortedCollection
长答案:
由于我假设您想知道如果必须的话,您将如何在Smalltalk中实现Java代码的等价物,因此这里有一个相对“直译”,您可以在工作区中测试(在Pharo中测试,也应该在Squeak中测试):
再次请注意,我故意更改了名称,因为我不认为selectionSort
是该方法所做工作的描述性名称,我也不会将集合用作居住在其他地方的方法的参数-如何进行排序的知识属于集合本身
不过,我相信您可以很容易地找到一个更好的滚动您自己的答案。例如,您可以尝试发送一个SequenceableCollection
实例消息sort:
,并将一个排序块作为参数传递,在该参数中,您可以指定您希望如何对元素进行排序。这里是逐行翻译。Row编号不是代码的一部分
1. selectionSort: num
2. | first temp |
3. num size to: 1 by: -1 do: [:i |
4. first := 1. "initialize to subscript of first element"
5. 1 to: i do: [:j |
6. "locate smallest element between positions 1 and i"
7. (num at: j) < (num at: first) ifTrue: [first := j]].
8. temp := num at: first. "swap smallest with element in position i"
9. num at: first put: (num at: i).
10. num at: i put: temp]
无需回答num
,因为该方法已对其进行了修改。但是,请参阅,有趣的讨论源自Amos的回答:
您的代码基本上是正确的,但不应该存储到文字数组(#(…)
)中。可能会将第一行更改为someNumbers:=#(7 2 8 5)副本。
@Tobias:就像我说的,这是一个“文字翻译”是的,这是正确的。但是假设你是在一个方法中编写这段代码。你希望每次调用它时,第一行都是一样的,但在第一次调用后,这不是真的。这有点奇怪复杂,所以我做了一个社区维基条目:@Tobias:我很感谢你为了表达你的观点所做的努力,这是一个相当棘手的案例-我在那里对你的问题和答案都投了赞成票。如果这段代码是在一个方法中而不是仅仅作为一个工作区示例,那么显然一开始就不会使用文字数组-数组将是参数,该方法最有可能是“回答接收器的排序副本”。很高兴更新答案以包含副本
,不过,感谢您指出这一点。谢谢!这非常清楚和有用!我改变了一点方式,但这一步一步地解释了代码。
copySortedDescending
"Answer a copy of the receiver, sorted in descending order."
| copy |
copy := self copy.
copy size to: 1 by: -1 do: [:eachOuterIndex |
"... and so on..."
].
^copy
1. selectionSort: num
2. | first temp |
3. num size to: 1 by: -1 do: [:i |
4. first := 1. "initialize to subscript of first element"
5. 1 to: i do: [:j |
6. "locate smallest element between positions 1 and i"
7. (num at: j) < (num at: first) ifTrue: [first := j]].
8. temp := num at: first. "swap smallest with element in position i"
9. num at: first put: (num at: i).
10. num at: i put: temp]
num
at: first put: (num at: i);
at: i put: temp