scala 九大排序算法
排序算法
- 直接插入排序
- 堆排序
- 冒泡排序
- 快速排序
- 选择排序
- 归并排序
- 计数排序
- 桶排序
- 基数排序
源代码
import java.io.PrintWriter
import scala.collection.mutable.ArrayBuffer
import scala.io.Source
import scala.util.Random
import 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 {
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
if (i < j) {
inputData(i) = inputData(j)
i = i + 1
}
while (i < j && inputData(i) < x) i = i + 1
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] = {
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] = {
var n = 1
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) {
if (n != 1 && !hasNum) {
break
}
hasNum = false
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
}
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
}
}