Skip to content

Commit 715c4e2

Browse files
Merge pull request wangzheng0822#215 from email2liyang/master
scala all sorts implementation
2 parents 405dc91 + b639322 commit 715c4e2

File tree

16 files changed

+823
-67
lines changed

16 files changed

+823
-67
lines changed

scala/src/main/scala/ch11_sorts/Sorts.scala

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,63 +8,63 @@ import scala.util.control.Breaks.{break, breakable}
88
* Author: yangchuz
99
*/
1010
object Sorts {
11-
def main(args: Array[String]): Unit ={
12-
// println(bubbleSort(Array(0, 6, 2, 3, 8, 5, 6, 7), 8).mkString(", "))
13-
// println(insertSort(Array(0, 6, 2, 3, 8, 5, 6, 7), 8).mkString(", "))
14-
println(selectionSort(Array(0, 6, 2, 3, 8, 5, 6, 7), 8).mkString(", "))
15-
}
1611

17-
def bubbleSort(arr: Array[Int], n:Int): Array[Int] = {
18-
val n = arr.length
12+
def bubbleSort(items: Array[Int]): Array[Int] = {
13+
val length = items.length
1914
breakable {
20-
for(i <- (n-1) to (1, -1)){
21-
var flag = false
22-
for(j <- 0 until i){
23-
if(arr(j) > arr(j+1)){
24-
val tmp = arr(j)
25-
arr(j) = arr(j+1)
26-
arr(j+1) = tmp
27-
flag = true
15+
for (i <- Range(0, length)) {
16+
var exit = true
17+
for (j <- Range(0, length - i - 1)) {
18+
if (items(j + 1) < items(j)) {
19+
val temp = items(j + 1)
20+
items(j + 1) = items(j)
21+
items(j) = temp
22+
exit = false
2823
}
2924
}
30-
if(!flag){
25+
if (exit) {
3126
break
3227
}
3328
}
3429
}
35-
arr
30+
items
3631
}
3732

38-
def insertSort(arr: Array[Int], n:Int): Array[Int] = {
39-
for(i <- 1 until n){
40-
val tmp = arr(i)
41-
breakable{
42-
for(j <- (i-1) to (0, -1)){
43-
if(tmp < arr(j)){
44-
arr(j+1) = arr(j)
45-
}else{
46-
arr(j+1) = tmp
33+
def insertSort(items: Array[Int]): Array[Int] = {
34+
val length = items.length
35+
for (i <- Range(1, length)) {
36+
val value = items(i)
37+
var j = i - 1
38+
breakable {
39+
while (j >= 0) {
40+
if (items(j) > value) {
41+
items(j + 1) = items(j)
42+
} else {
4743
break
4844
}
45+
j -= 1
4946
}
5047
}
48+
items(j + 1) = value
5149
}
52-
arr
50+
items
5351
}
5452

55-
def selectionSort(arr: Array[Int], n:Int): Array[Int] = {
56-
for(i <- 0 until n){
57-
var min = i
58-
for(j <- (i + 1) until n){
59-
if(arr(j) < arr(min)){
60-
min = j
53+
def selectionSort(items: Array[Int]): Array[Int] = {
54+
val length = items.length
55+
for (i <- Range(0, length)) {
56+
var minIndex = i
57+
for (j <- Range(i + 1, length)) {
58+
if (items(j) < items(minIndex)) {
59+
minIndex = j
6160
}
6261
}
6362

64-
val tmp = arr(i)
65-
arr(i) = arr(min)
66-
arr(min) = tmp
63+
//put the min value to the front
64+
val temp = items(i)
65+
items(i) = items(minIndex)
66+
items(minIndex) = temp
6767
}
68-
arr
68+
items
6969
}
7070
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package ch12_sorts
2+
3+
object MergeSort {
4+
5+
def mergeSort(items: Array[Int]): Array[Int] = {
6+
_mergeSort(items, 0, items.length - 1)
7+
items
8+
}
9+
10+
11+
private[this] def _mergeSort(items: Array[Int], p: Int, r: Int): Unit = {
12+
if (p >= r) {
13+
return
14+
}
15+
16+
val q = p + (r - p) / 2
17+
_mergeSort(items, p, q)
18+
_mergeSort(items, q + 1, r)
19+
_merge(items, p, q, r)
20+
21+
}
22+
23+
private[this] def _merge(items: Array[Int], p: Int, q: Int, r: Int): Unit = {
24+
//start of first half
25+
var i = p
26+
//start of second half
27+
var j = q + 1
28+
var k = 0
29+
//temp array to hold the data
30+
val tempArray = new Array[Int](r - p + 1)
31+
while (i <= q && j <= r) {
32+
if (items(i) <= items(j)) {
33+
tempArray(k) = items(i)
34+
i += 1
35+
} else {
36+
tempArray(k) = items(j)
37+
j += 1
38+
}
39+
k += 1
40+
}
41+
42+
var start = i
43+
var end = q
44+
45+
if (j <= r) {
46+
start = j
47+
end = r
48+
}
49+
50+
for (n <- start to end) {
51+
tempArray(k) = items(n)
52+
k += 1
53+
}
54+
55+
//copy tempArray back to items
56+
for (n <- 0 to r - p) {
57+
items(p + n) = tempArray(n)
58+
}
59+
}
60+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package ch12_sorts
2+
3+
object QuickSort {
4+
5+
//find the K th smallest element int the array
6+
def findKthElement(items: Array[Int], k: Int): Int = {
7+
_findKthElement(items, k, 0, items.length - 1)
8+
}
9+
10+
private[this] def _findKthElement(items: Array[Int], k: Int, p: Int, r: Int): Int = {
11+
val q = _partition(items, p, r)
12+
13+
if (k == q + 1) {
14+
items(q)
15+
} else if (k < q + 1) {
16+
_findKthElement(items, k, p, q - 1)
17+
} else {
18+
_findKthElement(items, k, q + 1, r)
19+
}
20+
}
21+
22+
def quickSort(items: Array[Int]): Array[Int] = {
23+
_quickSort(items, 0, items.length - 1)
24+
items
25+
}
26+
27+
private[this] def _quickSort(items: Array[Int], p: Int, r: Int): Unit = {
28+
if (p >= r) {
29+
return
30+
}
31+
val q = _partition(items, p, r)
32+
_quickSort(items, p, q - 1)
33+
_quickSort(items, q + 1, r)
34+
}
35+
36+
private[this] def _partition(items: Array[Int], p: Int, r: Int): Int = {
37+
val pivot = items(r)
38+
var i = p
39+
for (j <- Range(p, r)) {
40+
if (items(j) < pivot) {
41+
val temp = items(i)
42+
items(i) = items(j)
43+
items(j) = temp
44+
i += 1
45+
}
46+
}
47+
48+
val temp = items(i)
49+
items(i) = items(r)
50+
items(r) = temp
51+
52+
i
53+
}
54+
}
Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,50 @@
11
package ch15_bsearch
22

3+
import scala.math.abs
4+
35
object BSearch {
4-
def search(nums: Array[Int], target: Int): Int = {
5-
var low = 0
6-
var high = nums.length - 1
7-
while(low <= high){
8-
val mid = low + ((high - low) >> 2)
9-
if(nums(mid) > target){
10-
high = mid - 1
11-
} else if (nums(mid) < target){
12-
low = mid + 1
13-
} else {
14-
return mid
15-
}
16-
}
17-
18-
return -1
6+
7+
def search(items: Array[Int], target: Int): Int = {
8+
var low = 0
9+
var high = items.length - 1
10+
while (low <= high) {
11+
val mid = low + (high - low) / 2
12+
if (items(mid) == target) {
13+
return mid
14+
} else if (items(mid) > target) {
15+
high = mid - 1
16+
} else {
17+
low = mid + 1
18+
}
1919
}
20+
21+
-1
22+
}
23+
24+
def sqrt(x: Double, precision: Double): Double = {
25+
26+
require(precision > 0, "precision must > 0")
27+
require(x > 0, "input value for sqrt must > 0")
28+
var low = 0.0
29+
var high = x
30+
val actualPrecision = precision / 10
31+
32+
if (x > 0 && x < 1) {
33+
low = x
34+
high = 1
35+
}
36+
while (high - low > actualPrecision) {
37+
val mid = low + (high - low) / 2
38+
if (abs(mid * mid - x) < actualPrecision) {
39+
//find it
40+
return mid
41+
} else if (mid * mid > x) {
42+
high = mid
43+
} else {
44+
low = mid
45+
}
46+
}
47+
throw new IllegalStateException("could not determine the sqrt value for " + x)
48+
49+
}
2050
}
Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
package ch15_bsearch
22

33
object BSearchRecursive {
4-
def search(nums: Array[Int], target: Int): Int = {
5-
return searchInternal(nums, target, 0, nums.length - 1)
4+
5+
def search(items: Array[Int], target: Int): Int = {
6+
_search(items, target, 0, items.length - 1)
7+
}
8+
9+
private[this] def _search(items: Array[Int], target: Int, low: Int, high: Int): Int = {
10+
if (low > high) {
11+
return -1
612
}
713

8-
def searchInternal(nums:Array[Int], target: Int, low: Int, high: Int): Int = {
9-
if(low <= high){
10-
val mid = low + ((high - low) >> 2)
11-
if(nums(mid) > target){
12-
searchInternal(nums, target, low, mid - 1)
13-
} else if (nums(mid) < target){
14-
searchInternal(nums, target, mid + 1, high)
15-
} else {
16-
return mid
17-
}
18-
}else{
19-
return -1
20-
}
14+
val mid = low + (high - low) / 2
15+
if (items(mid) == target) {
16+
mid
17+
} else if (items(mid) > target) {
18+
_search(items, target, low, mid - 1)
19+
} else {
20+
_search(items, target, mid + 1, high)
2121
}
22+
}
2223
}

0 commit comments

Comments
 (0)