scala 九大排序算法
来源:互联网 发布:暗黑2 1.13 完美 mac 编辑:程序博客网 时间:2024/05/23 18:42
scala 九大排序算法
排序算法
- 直接插入排序
- 堆排序
- 冒泡排序
- 快速排序
- 选择排序
- 归并排序
- 计数排序
- 桶排序
- 基数排序
源代码
import java.io.PrintWriterimport scala.collection.mutable.ArrayBufferimport scala.io.Sourceimport scala.util.Randomimport scala.util.control.Breaks._/** * Created by user on 6/2/17. */object SortAll { def main(args: Array[String]): Unit = { val timestart = System.currentTimeMillis() val num=400000 val creatData = new PrintWriter("/home/user/inputdata") //产生待排序数据 for (_ <- 1 to 300000000) creatData.println(Random.nextInt(num)) creatData.close() val file = Source.fromFile("/home/user/inputdata") val predata = new ArrayBuffer[Int] for (line <- file.getLines()) predata += line.toInt val sorteddata = qksort(predata) //根据需要,调用不同的排序函数 val outData = new PrintWriter("/home/user/outdata") for (i <- sorteddata) outData.println(i) val timeover = System.currentTimeMillis() print("The runtime is " + (timeover - timestart) / 1000.0 + " s") } /*函数功能:直接插入排序*/ def SinsrtSort(inputData: ArrayBuffer[Int]): ArrayBuffer[Int] = { for (i <- 1 until inputData.length) { val x = inputData(i) var j = i - 1 while (j > 0 && x < inputData(j)) { inputData(j + 1) = inputData(j) j = j - 1 } inputData(j + 1) = x } inputData } /*函数功能:堆化*/ def heapify(inputData: ArrayBuffer[Int], m: Int, j: Int): Unit = { var i = m var k = 2 * i val x = inputData(i) breakable { //调用循环终止break方法 while (k <= j) { if (k < j) if (inputData(k) < inputData(k + 1)) k = k + 1 if (x >= inputData(k)) break else { inputData(i) = inputData(k) i = k k = 2 * i } } } inputData(i) = x } /*函数功能:堆排序*/ def heapSort(inputData: ArrayBuffer[Int]): ArrayBuffer[Int] = { var i = inputData.length / 2 while (i >= 1) { heapify(inputData, i - 1, inputData.length - 1) i = i - 1 } var j = inputData.length - 1 while (j > 0) { val x = inputData(0) inputData(0) = inputData(j) inputData(j) = x heapify(inputData, 0, j - 1) j = j - 1 } inputData } /*函数功能:冒泡排序*/ def bubblingSort(inputData: ArrayBuffer[Int]): ArrayBuffer[Int] = { for (j <- 0 to inputData.length - 3) for (i <- 0 to inputData.length - 2 - j) { if (inputData(i) > inputData(i + 1)) { //判断前一个元素是否大于后一个,如果大于,则交换 val temp = inputData(i + 1) inputData(i + 1) = inputData(i) inputData(i) = temp } } inputData } /*函数功能:快速排序*/ def qksort(inputData: ArrayBuffer[Int]): ArrayBuffer[Int] = { def qsort1(inputData: ArrayBuffer[Int], left: Int, right: Int): Unit = { if (left < right) { var i = left var j = right val x = inputData(i) while (i < j) { while (i < j && inputData(j) > x) j = j - 1 /* 从右向左找第一个小于x的数 */ if (i < j) { inputData(i) = inputData(j) i = i + 1 } while (i < j && inputData(i) < x) i = i + 1 /* 从左向右找第一个大于x的数 */ if (i < j) { inputData(j) = inputData(i) j = j - 1 } } inputData(i) = x qsort1(inputData, left, i - 1) /* 递归调用 */ qsort1(inputData, i + 1, right) } } qsort1(inputData, 0, inputData.length - 1) inputData } //选择排序 def SelectionSort(inputData: ArrayBuffer[Int]): ArrayBuffer[Int] = { for (i <- 0 until inputData.length - 1) { var index = i var value = inputData(i) for (j <- i + 1 until inputData.length) { if (value > inputData(j)) { index = j value = inputData(j) } } if (index != i) { inputData(index) = inputData(i) inputData(i) = value } } inputData } //归并排序 def merge(a: List[Int], b: List[Int]): List[Int] = (a, b) match { case (Nil, _) => b case (_, Nil) => a case (x :: xs, y :: ys) => if (x <= y) x :: merge(xs, b) else y :: merge(a, ys) } def mergeSort(lst: List[Int]): List[Int] = { if (lst.length < 2) lst else { val (first, second) = lst.splitAt(lst.length / 2) merge(mergeSort(first), mergeSort(second)) } } //计数排序 def Countingsort(inputData: ArrayBuffer[Int], k: Int): Array[Int] = { //k表示有所输入数字都介于0到k之间 val temp = new Array[Int](k) // 临时存储区 val outdata = new Array[Int](inputData.length) val len = temp.length for (i <- 0 until len) { // 初始化 temp(i) = 0 } for (i <- inputData.indices) { temp(inputData(i)) = temp(inputData(i)) + 1 } for (i <- 1 until len) { temp(i) = temp(i) + temp(i - 1) } // 把输入数组中的元素放在输出数组中对应的位置上 var n = inputData.length - 1 while (n >= 0) { // 从后往前遍历 outdata(temp(inputData(n)) - 1) = inputData(n) temp(inputData(n)) = temp(inputData(n)) - 1 n = n - 1 } outdata } //桶排序 def bucketsort(inputData: ArrayBuffer[Int], max: Int): ArrayBuffer[Int] = { var buckets = new Array[Int](max) for (i <- inputData.indices) //计数 buckets(inputData(i)) = buckets(inputData(i)) + 1 var j = 0 for (i <- 0 until max) while (buckets(i) > 0) { inputData(j) = i j = j + 1 buckets(i) = buckets(i) - 1 } buckets = null inputData } /** 基数排序函数 * B表示要排序的数组 * d表示每一位数字的范围(这里是10进制数,有0~9一共10种情况) */ def RadixSort(inputData: ArrayBuffer[Int], d: Int): ArrayBuffer[Int] = { //n用来表示当前排序的是第几位 var n = 1 //hasNum用来表示数组中是否有至少一个数字存在第n位 var hasNum = false /** 二维数组temp用来保存当前排序的数字 * 第一维d表示一共有d个桶 * 第二维B.length表示每个桶最多可能存放B.length个数字 */ val temp = Array.ofDim[Int](d, inputData.length) val order = new Array[Int](d) breakable { while (true) { //判断是否所有元素均无比更高位,因为第一遍一定要先排序一次,所以有n!=1的判断 if (n != 1 && !hasNum) { break } hasNum = false //遍历要排序的数组,将其存入temp数组中(按照第n位上的数字将数字放入桶中) for (i <- inputData.indices) { val x = inputData(i) / (n * 10) if (x != 0) hasNum = true val lsd = x % 10 temp(lsd)(order(lsd)) = inputData(i) order(lsd) = order(lsd) + 1 } //k用来将排序好的temp数组存入B数组(将桶中的数字倒出) var k = 0 for (i <- 0 until d) { if (order(i) != 0) { var j = 0 while (j < order(i)) { inputData(k) = temp(i)(j) k = k + 1 j = j + 1 } } order(i) = 0 } n = n + 1 } } inputData }}
阅读全文
1 0
- scala 九大排序算法
- 九大排序算法
- 九大排序算法
- 九大排序算法
- 九大排序算法
- 九大排序算法
- 九大排序算法
- 九大排序算法
- 九大排序算法
- 九大排序算法总结
- 九大排序算法总结
- 九大排序算法总结
- 九大排序算法总结
- 九大排序算法总结
- 九大排序算法总结
- 九大排序算法总结
- 九大排序算法总结
- 九大排序算法总结
- 地图之CLLocationManager的使用
- php中关于线程thread的使用
- vue使用过程中遇到的错误提示一
- 4556: [Tjoi2016&Heoi2016]字符串 后缀自动机 详细
- SFP光模块大全,你想了解的这里都有!
- scala 九大排序算法
- Django-Cookie的使用
- 常见的视频流协议
- haproxy+keepalived配置
- 多边形划分-卡特兰数
- Merge into使用详解-
- Django-Cookie与装饰器
- MySQL主从
- Java读写Excel之POI超入门