scala中快速排序、归并排序、二分查找的写法
快速排序
详解思想见:快速排序详解
package blog
/**
*快速排序
*/
object QuickSort {
def main(args: Array[String]): Unit = {
val arr = Array(-2, -4, 4, 5, -1, 8, -9, 11)
println("排序后的数组:" + quickSort(arr).mkString("[", ",", "]"))
}
/*
快速排序的核心思想为左边的比基准数小,右边的比基准数大,所以我们可以
利用scala中的partition方法将数组分为左右两组,head表示第一个数即
基准数,tail表示剩下的数。
*/
def quickSort(arr: Array[Int]): Array[Int] = {
//递归先写递归出口,每一次递归待排序的数组中的元素就会减少,待所有的数完成排序后,数组自然为空
if (arr.isEmpty) Array()
else {
//将数组分成两半,符合条件的数组放在左边
val (left, right) = arr.tail.partition(num => num < arr.head)
//按照小+基准数+大的顺序将数组拼接起来,.:+表示加在首部,.++表示加在尾部
(quickSort(left)).:+(arr.head).++(quickSort(right))
}
}
}
归并排序
详解思想见:归并排序详解
package blog
/**
* 归并排序
*/
object MergerSort {
def main(args: Array[String]): Unit = {
val arr = Array(-2, -4, 4, 5, -1, 8, -9, 11)
val temp = new Array[Int](arr.length)
mergeSort(arr, 0, arr.length - 1, temp)
println(arr.mkString("[", ",", "]"))
}
def mergeSort(arr: Array[Int], left: Int, right: Int, temp: Array[Int]): Unit = {
if (left < right) {
val mid = (left + right) / 2
mergeSort(arr, left, mid, temp)
mergeSort(arr, mid + 1, right, temp)
merge(arr, left, mid, right)
}
def merge(arr: Array[Int], left: Int, mid: Int, right: Int): Unit = {
val temp = new Array[Int](right - left + 1)
var i = left
var j = mid + 1
var k = 0
while (i <= mid && j <= right) {
if (arr(i) <= arr(j)) {
temp(k) = arr(i)
k += 1
i += 1
} else {
temp(k) = arr(j)
k += 1
j += 1
}
}
while (i <= mid) {
temp(k) = arr(i)
k += 1
i += 1
}
while (j <= right) {
temp(k) = arr(j)
k += 1
j += 1
}
for (n <- 0 until temp.length)
arr(left + n) = temp(n)
}
}
}
二分查找
package blog
/**
* 二分查找
*/
object BinarySearch {
def main(args: Array[String]): Unit = {
val arr = Array(-2, -4, 4, 5, -1, 8, -9, 11)
val key = 4
var index = binarySearch(arr, key)
println("非递归:"+index)
index = binarySearch(arr, key, 0, arr.length - 1)
println("递归:"+index)
}
/*
二分查找的思想就是,先找中间的数,如果比中间的
数大,就在左边找,如果比中间的数小,就在右边找
*/
//非递归
def binarySearch(array: Array[Int], key: Int): Int = {
var start = 0
var end = array.length - 1
while (start <= end) {
val mid = (start + end) / 2
if (key == array(mid))
//这里必须加return才能跳出循环
return mid
else if (key < array(mid))
end = mid - 1
else
start = mid + 1
}
//这里不存在的数我返回一个如果他存在所在的位置,并加上符号
return -start
}
//递归
def binarySearch(array: Array[Int], key: Int, start: Int, end: Int): Int = {
val mid = (start + end) / 2
if (start <= end) {
if (key == array(mid))
return mid
else if (key < array(mid))
return binarySearch(array, key, 0, mid - 1)
else
return binarySearch(array, key, mid + 1, end)
} else
return -start
}
}