/ 城寒 / Scala - Practice

Scala - Practice

2018-01-27 posted in [Scala]

import Array._
// val与var初始化的区别:val是value不可修改,var是variable
// 访问时使用小括号()而不是中括号[]
val ori = Array(1,6,8,5,3,2,4,9,0,7)
// Array可以先声明长度再修改
val ori_example:Array[Int] = new Array[Int](2)
// ori_example(0) = 1
// ori_example(1) = 2
// "Unit" 表示没有返回值
// 所有参数本身都不可以修改,数组对应的内容可以修改
def swap( arr:Array[Int], a:Int, b:Int ): Unit = {
    val tmp = arr(a); arr(a) = arr(b); arr(b) = tmp
}
// isInstanceOf后用的是中括号
def prints(arr:Any): Unit = {
    if( arr.isInstanceOf[Array[Int]] ){
        val tmp = arr.asInstanceOf[Array[Int]]
        tmp.foreach( a => print( a + " " ) )
        println()
    }
    // // isInstanceOf判断类型时,回去掉参数,无法区分List[Int]和List[String]
    // else if( arr.isInstanceOf[List] ){
    //  val tmp = arr.asInstanceOf[List[Int]]
    //  tmp.foreach( a => print( a + " " ) )
    //  println()
    // }
}
def printa(arr1:Array[Int]): Unit = {
    arr1.foreach( a => print( a + " " ) )
    println()
}
def printl(arr1:List[Int]): Unit = {
    arr1.foreach( a => print( a + " " ) )
    println()
}
// 冒泡排序
def bubbleSort(arr:Array[Int]): Unit = {
    var pos = arr.length - 1
    while( pos != 0 ){
        val bound = pos;
        pos = 0;
        for( i <- 0 until bound ){
            if( arr(i) > arr(i+1) ){
                swap( arr, i, i + 1 )
                pos = i;
            }
        }
    }
}
val ori_1 = ori.clone
printa(ori_1)
println("bubbleSort")
bubbleSort(ori_1)
printa(ori_1)
// 递归快排
// :: 表示当个元素加到List头部或者尾部,++表示连接
// head 只取第一个,tail 取第二个开始的全部
def quickSort(arr:List[Int]): List[Int] = {
    if (arr.isEmpty) arr
    else {
        val p = arr.head
        val (left, right) = arr.tail.partition(_ < p)
        quickSort(left) ++ (p :: quickSort(right))
    }
}
val ori_2 = ori.toList
println("QuickSort")
val ori_3 = quickSort(ori_2)
printl(ori_3)
// 函数式风格的快排
// Array 拼接需要import Array._
def quickSort_fun(arr:Array[Int]): Array[Int] = {
    if (arr.length <= 1) arr
    else {
        val pivot = arr(arr.length / 2)
        concat(quickSort_fun(arr filter(pivot > _)),
                            (arr filter(pivot == _)),
               quickSort_fun(arr filter(pivot < _)))
    }
}
val ori_4 = ori.clone
println("QuickSort functional")
val ori_5 = quickSort_fun(ori_4)
printa(ori_5)
// 函数式风格的快排
def quickSort_fun_l(arr:List[Int]): List[Int] = {
    if (arr.length <= 1) arr
    else {
        val pivot = arr(arr.length / 2)
        quickSort_fun_l(arr filter(pivot > _)) ++
            (arr filter(pivot == _)) ++
            quickSort_fun_l(arr filter(pivot < _))
    }
}
val ori_6 = ori.toList
println("QuickSort functional")
val ori_7 = quickSort_fun_l(ori_6)
printl(ori_7)