2010-04-22 31 views
5

Có thể thực hiện this điều gì đó trong Scala không?Lazy Quicksort tại Scala

+5

IMHO, một câu hỏi cần được khép kín. Liên kết để biết thêm chi tiết không sao, nhưng việc trích dẫn hai dòng haskell-code ở đây sẽ không quá nhiều công việc. –

Trả lời

1

Có!

Scala hỗ trợ "lazy vals" như một cách để hoãn tính toán giá trị cho đến khi nó thực sự được sử dụng. Phần lớn thư viện Scala 2.8 có khả năng làm việc với các bộ sưu tập được xác định lười biếng.

+0

điều này không trả lời câu hỏi được hỏi. –

13
def quicksort[A](xs: Stream[A])(implicit o: Ordering[A]): Stream[A] = { 
    import o._ 
    if (xs.isEmpty) xs else { 
     val (smaller, bigger) = xs.tail.partition(_ < xs.head) 
     quicksort(smaller) #::: xs.head #:: quicksort(bigger) 
    } 
} 

Nó có thể được thực hiện với quan điểm là tốt, mặc dù đó là ràng buộc để được chậm hơn nhiều:

def quicksort[A](xs: List[A])(implicit o: Ordering[A]) = { 
    import o._ 
    def qs(xs: SeqView[A, List[A]]): SeqView[A, Seq[_]] = if (xs.isEmpty) xs else { 
    val (smaller, bigger) = xs.tail.partition(_ < xs.head) 
    qs(smaller) ++ (xs.head +: qs(bigger)) 
    } 
    qs(xs.view) 
} 
+0

Cảm ơn nhưng tôi cũng muốn xem triển khai chế độ xem danh sách. – Mahesh

+0

@Mahesh Việc triển khai chế độ xem sẽ trở nên khó khăn hơn tôi tưởng tượng lần đầu tiên. Tôi sẽ tiếp tục cố gắng để xem một cái gì đó hoạt động. –

+0

@Mahesh Ok, đã giải quyết được vấn đề. Tôi đã quên đi '.head' trên đường nối ... Silly me. –