def quickSort1(array: Array[Int]): Array[Int] = {
def swap(x: Int, y: Int): Unit = {
val tmp = array(x)
array(x) = array(y)
array(y) = tmp
}
def qSort(l: Int, r: Int) {
if (l < r) {
var m = l
for (i <- l + 1 to r) {
if (array(i) < array(l)) {
m += 1
swap(i, m)
}
}
swap(l, m)
qSort(l, m - 1)
qSort(m + 1, r)
}
}
qSort(0, array.length - 1)
array
} def quickSort2(array: Array[Int]): Array[Int] = {
if(array.isEmpty) array
else {
val m = array(0)
Array.concat(
quickSort2(array.filter(_ < m)),
array.filter(_ == m),
quickSort2(array.filter(_ > m))
)
}
} def mergeSort(list: List[Int]): List[Int] = {
def merge(l: List[Int], r: List[Int]): List[Int] =
(l, r) match {
case (Nil, _) => r
case (_, Nil) => l
case (x :: xl, y :: yr) =>
if(x < y) x :: merge(xl, r)
else y :: merge(l, yr)
}
val n = list.length / 2
if(n == 0) list
else {
val (l, r) = list splitAt n
merge(mergeSort(l), mergeSort(r))
}
} import java.util.Date
import scala.util.Random val array = Random.shuffle(1 to 3000).toArray val list = array.toList // quickSort1:
val start = new Date().getTime
val array1 = quickSort1(array.clone)
println("quickSort1: " + (new Date().getTime - start) + " ms") // quickSort2:
val start2 = new Date().getTime
val array2 = quickSort2(array.clone)
println("quickSort2: " + (new Date().getTime - start2) + " ms") // mergeSort:
val start3 = new Date().getTime
val list3 = mergeSort(list)
println("mergeSort: " + (new Date().getTime - start3) + " ms")
val array3 = list3.toArray println("Equal? array1 array2 " + array1.sameElements(array2))
println("Equal? array1 array3 " + array1.sameElements(array3))

Output:

quickSort1: 23 ms
quickSort2: 61 ms
mergeSort: 24 ms
Equal? array1 array2 true
Equal? array1 array3 true

可以发现快速排序的第一种实现和归并排序的效率几乎相同。

而快速排序的第二种实现则要稍慢,但是更加简洁和直观。

观察第二种实现可以发现,它没有改变原来的数组,而是通过 \(filter\) 函数直接得到新的数组,再通过 \(concat\) 函数把它们的返回值合并起来。所以算法的效率有所降低。

Scala 实现快速排序和归并排序的更多相关文章

  1. Java实现单链表的快速排序和归并排序

    本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...

  2. Scala实现冒泡排序、归并排序和快速排序

    1.冒泡排序 def sort(list: List[Int]): List[Int] = list match { case List() => List() case head :: tai ...

  3. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

  4. 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)

    总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...

  5. Java快速排序和归并排序详解

    快速排序 概述 快速排序算法借鉴的是二叉树前序遍历的思想,最终对数组进行排序. 优点: 对于数据量比较大的数组排序,由于采用的具有二叉树二分的思想,故排序速度比较快 局限 只适用于顺序存储结构的数据排 ...

  6. 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版

    每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...

  7. 牛B三人组-快速排序-堆排序-归并排序

    快速排序 随便取个数,作为标志值,这里就默认为索引位置为0的值 记录左索引和右索引,从右往左找比标志值小的,小值和左索引值交换,右索引变化,然后从左往右找比标志值大的,大值和右索引值交换,左索引变化 ...

  8. 数据结构之排序技术:快速排序、归并排序、堆排序(C++版)

    快速排序 #include <iostream> using namespace std; void swap(int num[], int i, int j) { int temp = ...

  9. 快速排序和归并排序(C语言)

    1.0快速排序算法 (1)分解 (2)递归求解 (3)合并 int partition(int a[],int p,int r) { int i=p,j=r+1; int x=a[p]; int te ...

随机推荐

  1. 【题解】HNOI2017大佬

    哎……做了几个小时最后还是没能想到怼大佬的合法性到底怎么搞.写暴力爆搜感觉复杂度爆炸就没敢写 bfs / dfs 一类,后来发现在种种的约束条件下(远小于所给的 \(n, m\))复杂度完全是可以承受 ...

  2. [bzoj1056] [HAOI2008]排名系统

    Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...

  3. 算法学习——st表

    st表是一种基于倍增思想的DP. 用于求一个数列中的某个区间的最大/最小值. 用st[i][j]表示从第i个开始往后2^j个点,最大的是多少. 我们令k[i]表示2^i等于多少 那么有转移方程 st[ ...

  4. bug 跟蚊子的相似之处

    bug 跟蚊子的相似之处: 1.不知道藏在哪里. 2.不知道有多少. 3.总是在你即将睡觉休息的时候出现. 2 A:最近在看<一拳超人>,觉得咱们程序猿跟埼玉老师有点像啊! B:哪里像了? ...

  5. http缓存知多少

    很久没有写博客了,趁现在也快过年,最近项目不是很忙,写一篇博客做为2018年的开始,重拾刚毕业的几年前写博客的冲动.http协议是每个程序猿应该需要知道的东西,不管是前端人员还是后端人员,以前在上家公 ...

  6. Awk basic and practice

    定义:Awk是一种程序语言,用来处理数据和产生报告.数据可来自标准输入,文件,管道输出. 格式:#awk '/pattern/ {action}' filename 术语:pattern, 样式是由正 ...

  7. jquery学习之add()

    解读: add() 将元素添加到匹配元素的集合中 例1: <!DOCTYPE html> <html> <head> <style> div { wid ...

  8. 关于fragment点击能穿透问题

    本人在做项目的过程中遇到的这个问题,然后就在网上百度了一下,之后也是在csdn上看到博友发过此类问题的解决办法,所以特此重新总结一下,顺便也给自己提个醒,避免出现此类问题.好!下面我们说一下问题: 举 ...

  9. 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居

    [算法]并查集+平衡树+数学+扫描线 [题解] 经典曼哈顿距离转切比雪夫距离. 曼哈顿距离:S=|x1-x2|+|y1-y2|<=c 即:max(x1-x2+y1-y2,x1-x2-y1+y2, ...

  10. 04-plis属性列表

      源代码下载链接:04-plis属性列表.zip27.8 KB // MJPerson.h // //  MJPerson.h //  04-plis属性列表 // //  Created by a ...