Scala 排序算法的实现


Insert Sort

  import math.Ordering
  def iSort[T](a: List[T])(implicit ord: Ordering[T]): List[T] = {

    def insert(x: T, xs: List[T]): List[T] = xs match {
      case Nil => List(x)
      case y :: ys => if (ord.lt(x, y)) x :: xs else y :: insert(x, ys)
    }

    a match {
      case Nil => Nil
      case x :: xs =>
        insert(x, iSort(xs))
    }
  }


Quick Sort

  import math.Ordering
  def qSort[T](a: List[T])(implicit ord: Ordering[T]): List[T] = {

    if (a.length < 2) a
    else {
      val pivot = a.head
      val (first, second) = a.tail partition (x => ord.lt(x, pivot))
      qSort(first) ::: List(pivot) ::: qSort(second)
    }
  }
  
  
  //another implementation
  
  def qSort[T](a: List[T])(implicit ord: Ordering[T]): List[T] = {
    if (a.length < 2) a
    else qSort(a filter (ord.lt(a.head, _))) ++
         a.filter(ord.eq(a.head, _))) ++
         qSort(a filter (ord.gt(a.head, _)))
  }

Merge Sort

  import math.Ordering
  def mSort[T](a: List[T])(implicit ord: Ordering[T]): List[T] = {

    def merge(xs: List[T], ys: List[T]): List[T] = (xs, ys) match {

      case (Nil, ys) => ys
      case (xs, Nil) => xs
      case (a :: as, b :: bs) => if (ord.lt(a, b)) a :: merge(as, ys) 
	                                      else b :: merge(xs, bs)

    }

    val center = a.length / 2

    if (center == 0) a // when a has single element or Nil
    else {
      val (first, second) = a splitAt center

      merge(mSort(first), mSort(second))
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Scala 中可以使用 List 的 `sortBy` 方法实现快速排序。可以传入一个比较函数来自定义排序规则。 例如,对于整型 List,可以使用以下代码实现快速排序: ``` val list = List(3, 1, 4, 2, 5) val sortedList = list.sortBy(x => x) ``` 也可以在sortBy方法中使用匿名函数来自定义排序规则,如 ``` val list = List(3, 1, 4, 2, 5) val sortedList = list.sortBy(x => -x) ``` 这样会按照从大到小的顺序排序 ### 回答2: 快速排序是一种高效的排序算法Scala中的实现也很简单。下面是一种基于递归的快速排序算法实现示例: ```scala def quickSort(arr: Array[Int]): Array[Int] = { if (arr.length <= 1) arr else { val pivot = arr(arr.length / 2) Array.concat( quickSort(arr.filter(_ < pivot)), arr.filter(_ == pivot), quickSort(arr.filter(_ > pivot)) ) } } val arr = Array(7, 2, 1, 6, 8, 5, 3, 4) val sortedArr = quickSort(arr) println(sortedArr.mkString(", ")) ``` 这段代码首先检查数组长度是否小于等于1,如果是,则直接返回原数组。接着,选取中间的元素作为枢纽(pivot)。然后,使用`filter`方法筛选出小于、等于和大于枢纽的元素,并使用`Array.concat`方法将这些数组连接起来。最后,递归地对小于和大于枢纽的子数组进行快速排序。最终将排序好的数组返回。 以上代码将输出:1, 2, 3, 4, 5, 6, 7, 8 这是一个简单的快速排序实现示例,在实际应用中可能需要处理更多的特殊情况,例如重复元素的处理。 ### 回答3: 快速排序是一种常用的排序算法,在Scala实现也很简单。下面是一个使用递归实现的快速排序算法: ```scala def quickSort(nums: Array[Int]): Array[Int] = { if (nums.length <= 1) nums // 如果数组长度小于等于1,则已经有序,直接返回 else { val pivot = nums(nums.length / 2) // 选择数组中间的元素作为基准点 Array.concat( quickSort(nums.filter(_ < pivot)), // 处理小于基准点的子数组 nums.filter(_ == pivot), // 处理等于基准点的子数组 quickSort(nums.filter(_ > pivot)) // 处理大于基准点的子数组 ) } } // 示例 val nums = Array(6, 3, 8, 2, 9, 1) val sortedNums = quickSort(nums) println(sortedNums.mkString(", ")) ``` 上述代码中,`quickSort`函数接受一个整数数组作为输入,如果数组长度小于等于1,则直接返回原数组。否则,选择数组中间的元素作为基准点,将数组分成小于、等于和大于基准点的三个子数组。然后通过递归调用`quickSort`函数对小于和大于基准点的子数组进行排序,并通过`Array.concat`函数将排序后的三个子数组合并成一个有序数组。最后,返回这个有序数组作为函数的输出结果。 以上是一个简单的Scala实现的快速排序算法。快速排序的时间复杂度为O(nlogn),是一种高效的排序算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值