Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何在smalltalk中创建排序方法_Sorting_Methods_Smalltalk_Squeak - Fatal编程技术网

Sorting 如何在smalltalk中创建排序方法

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

我正在尝试在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 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