我试图从以下回购中了解这个快速排序代码
object QuickSort {
@inline final def limit: Int = 16
final def sort[@sp A:Order:ClassTag](data:Array[A]): Unit = qsort(data, 0, data.length - 1)
final def qsort[@sp A](data:Array[A], left: Int, right: Int)(implicit o:Order[A], ct:ClassTag[A]): Unit = {
if (right - left < limit) return InsertionSort.sort(data, left, right + 1)
val pivot = left + (right - left) / 2
val next = partition(data, left, right, pivot)
qsort(data, left, next - 1)
qsort(data, next + 1, right)
}
final def partition[@sp A](data:Array[A], left:Int, right:Int, pivot:Int)(implicit o:Order[A], ct:ClassTag[A]): Int = {
val value = data(pivot)
//swap(pivot, right)
var tmp = data(pivot); data(pivot) = data(right); data(right) = tmp
var store = left
var i = left
while (i < right) {
if (o.lt(data(i), value)) {
//swap(i, store)
tmp = data(i); data(i) = data(store); data(store) = tmp
store += 1
}
i += 1
}
//swap(store, right)
tmp = data(store); data(store) = data(right); data(right) = tmp
store
}
}
Run Code Online (Sandbox Code Playgroud)
目的是[@sp A]什么?我知道[A]语法是针对泛型的,但添加的@sp是什么?有人可以对此有所了解吗?
谢谢
@sp是spire包对象中@specialized定义的别名.
我们在尖顶中使用了很多专业化,因此必须@specialized在进口中编写或重命名太繁琐了.
请注意,如果您有单独的包语句,则spire包对象中的定义仅在子包中可见.
这样可行
package spire
package math
class Foo[@sp T]
Run Code Online (Sandbox Code Playgroud)
然而,这不会
package spire.math
class Foo[@sp T]
Run Code Online (Sandbox Code Playgroud)
在scala标准库中使用相同的方法.如果你看一下像scala.collection.immutable.Set这样的类,请注意package语句分三部分完成
package scala
package collection
package immutable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |