Scala 实现快速排序和归并排序
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 实现快速排序和归并排序的更多相关文章
- Java实现单链表的快速排序和归并排序
本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...
- Scala实现冒泡排序、归并排序和快速排序
1.冒泡排序 def sort(list: List[Int]): List[Int] = list match { case List() => List() case head :: tai ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...
- Java快速排序和归并排序详解
快速排序 概述 快速排序算法借鉴的是二叉树前序遍历的思想,最终对数组进行排序. 优点: 对于数据量比较大的数组排序,由于采用的具有二叉树二分的思想,故排序速度比较快 局限 只适用于顺序存储结构的数据排 ...
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...
- 牛B三人组-快速排序-堆排序-归并排序
快速排序 随便取个数,作为标志值,这里就默认为索引位置为0的值 记录左索引和右索引,从右往左找比标志值小的,小值和左索引值交换,右索引变化,然后从左往右找比标志值大的,大值和右索引值交换,左索引变化 ...
- 数据结构之排序技术:快速排序、归并排序、堆排序(C++版)
快速排序 #include <iostream> using namespace std; void swap(int num[], int i, int j) { int temp = ...
- 快速排序和归并排序(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 ...
随机推荐
- [USACO07DEC]美食的食草动物Gourmet Grazers
---题面--- 题解: 首先观察题面,直觉上对于一头奶牛,肯定要给它配pi和qi符合条件的草中两者尽量低的草,以节省下好草给高要求的牛. 实际上这是对的,但观察到两者尽量低这个条件并不明确,无法用于 ...
- 工具——SVN常用命令
SVN一般都是团队合作做一个项目所需用到的,为了是版本的统一 ;1. Check out——从服务器端取得代码 把服务器资料库里存放的某个项目代码取出来,放到本地主机中,这个动作叫做“check ...
- BZOJ 4318: OSU! 期望概率dp && 【BZOJ3450】【Tyvj1952】Easy 概率DP
这两道题是一样的...... 我就说一下较难的那个 OSU!: 这道15行的水题我竟然做了两节课...... 若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i ...
- ionic改tab文字和icon图片的颜色
The official way would be: Change in your theme/variables.scss Active icon for tabs on android is: $ ...
- angular的一些问题
引入第三方类库 1.安装依赖 npm install jquey --save 2.引入项目 在angular-cli.json "scripts": [ "../nod ...
- codeforces 1077F1
题目:https://codeforces.com/contest/1077/problem/F1 题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x 表示你要从中选出刚好x幅画,并且 ...
- 在Global.asax中过滤POST请求的非法参数。
using System;using System.Collections.Generic;using System.Collections.Specialized;using System.Linq ...
- Eclipse中的Web项目自动部署到Tomcat的webapp目录下
Eclipse中的Web项目自动部署到Tomcat 原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写 ...
- AWS CLI command example
1.list ec2 instance-id, instance status, type, ip address, name aws ec2 describe-instances --query ' ...
- js和jquery修改背景颜色的区别
html: <HTML> <head> <meta http-equiv="content-type" content="text/html ...