これはコードです:
object Main {
def main(args: Array[String]){
var myArray = Array(5,2,7,6,8,1,15,5/*,9,10,56*/)
var startSorting = new Starter(myArray)
startSorting.start
startSorting ! Begin
var i = 0
for( i <- 0 to myArray.length - 1){
println(myArray(i))
}
}
}
import scala.actors.Actor
import scala.actors.Actor._
abstract class SortArray
case object Sort extends SortArray
case object FinishedSubArraySorting extends SortArray
case object Begin extends SortArray
class Starter(toBeSorted :Array[Int]) extends Actor{
def act(){
var first:Array[Int] = Array()
var second:Array[Int] = Array()
loop{
react{
case Begin =>
var SortActor = new MergeSort(toBeSorted)
SortActor.start
SortActor ! Sort
case sortedArray :Array[Int] =>
var i = 0
println("Sortat:")
for( i <- 0 to sortedArray.length - 1){
println(sortedArray(i))
}
}
}
}
}
class MergeSort(toBeSorted :Array[Int]) extends Actor{
def act(){
var finishedSorting = 0
var thisArray = toBeSorted
var first:Array[Int] = Array();
var second:Array[Int] = Array();
var sortedSubArrays = 0;
loop{
react{
case Sort =>
if(thisArray.length == 1){
finishedSorting = 1
sender ! thisArray
exit('stop)
}else{
first = thisArray.slice(0,thisArray.length/2)
second = thisArray.slice(thisArray.length/2,thisArray.length)
var firstSort = new MergeSort(first)
var secondSort = new MergeSort(second)
firstSort.start
secondSort.start
firstSort ! Sort
secondSort ! Sort
}
case subSortedArray:Array[Int] =>
sortedSubArrays = sortedSubArrays + 1
if(sortedSubArrays == 1){
first = subSortedArray
}else{
second = subSortedArray
thisArray = merge(first,second)
finishedSorting = 1
sender ! thisArray
exit('stop)
}
}
}
}
def merge(firstArray :Array[Int],secondArray :Array[Int]):Array[Int] = {
var result:Array[Int] = new Array[Int](firstArray.length + secondArray.length)
var i = 0
var j = 0
var k = 0
while(i < firstArray.length && j < secondArray.length){
if(firstArray(i) <= secondArray(j)){
result(k) = firstArray(i)
i = i + 1
}else{
result(k) = secondArray(j)
j = j + 1
}
k = k + 1
}
while (i < firstArray.length)
{
result(k) = firstArray(i)
i = i + 1
k = k + 1
}
while (j < secondArray.length)
{
result(k) = secondArray(j)
j = j + 1
k = k + 1
}
return result
}
}
2 つのアクターを使用します。1 つは最初と最後の出力用で、もう 1 つは配列とサブ配列をマージソートするために複数のインスタンスを持つ予定です。!Sort
配列を 2 つに分割し、各 subArray に対して 2 つのアクターを作成するために、インスタンスが最初に呼び出されます。その後、前述の 2 つのアクターのそれぞれから結果として得られる並べ替えられたサブ配列を使用して呼び出されます。
このコードの問題は、最下位レベル (最大長 2 のサブ配列) でのみソートとマージを管理し、何らかの理由で、アクターが呼び出した送信者とは異なる送信者を呼び出すため、何も起こらないことです。