Skip to content

Commit d17416f

Browse files
committed
Add sort algorithms
1 parent 1709641 commit d17416f

File tree

96 files changed

+494
-129
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+494
-129
lines changed

README.md

Lines changed: 53 additions & 41 deletions
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package ru.romanow.algorithms
2+
3+
class BubbleSort {
4+
fun sort(arr: IntArray) {
5+
val n = arr.size
6+
for (i in 0 until n - 1) {
7+
for (j in 0 until n - i - 1) {
8+
if (arr[j] > arr[j + 1]) {
9+
val temp = arr[j]
10+
arr[j] = arr[j + 1]
11+
arr[j + 1] = temp
12+
}
13+
}
14+
}
15+
}
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package ru.romanow.algorithms
2+
3+
class InsertionSort {
4+
fun sort(arr: IntArray) {
5+
val n = arr.size
6+
for (i in 1 until n) {
7+
val key = arr[i]
8+
var j = i - 1
9+
10+
while (j >= 0 && arr[j] > key) {
11+
arr[j + 1] = arr[j]
12+
j--
13+
}
14+
arr[j + 1] = key
15+
}
16+
}
17+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package ru.romanow.algorithms
2+
3+
class MergeSort {
4+
fun sort(arr: IntArray, left: Int = 0, right: Int = arr.size - 1) {
5+
if (left < right) {
6+
val middle = (left + right) / 2
7+
sort(arr, left, middle)
8+
sort(arr, middle + 1, right)
9+
merge(arr, left, middle, right)
10+
}
11+
}
12+
13+
private fun merge(arr: IntArray, left: Int, middle: Int, right: Int) {
14+
val leftArray = arr.sliceArray(left..middle)
15+
val rightArray = arr.sliceArray(middle + 1..right)
16+
17+
var i = 0
18+
var j = 0
19+
var k = left
20+
21+
while (i < leftArray.size && j < rightArray.size) {
22+
arr[k++] = if (leftArray[i] <= rightArray[j]) leftArray[i++] else rightArray[j++]
23+
}
24+
25+
while (i < leftArray.size) {
26+
arr[k++] = leftArray[i++]
27+
}
28+
29+
while (j < rightArray.size) {
30+
arr[k++] = rightArray[j++]
31+
}
32+
}
33+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ru.romanow.algorithms
2+
3+
class QuickSort {
4+
fun sort(arr: IntArray, low: Int = 0, high: Int = arr.size - 1) {
5+
if (low < high) {
6+
val pivotIndex = partition(arr, low, high)
7+
sort(arr, low, pivotIndex - 1)
8+
sort(arr, pivotIndex + 1, high)
9+
}
10+
}
11+
12+
private fun partition(arr: IntArray, low: Int, high: Int): Int {
13+
val pivot = arr[high]
14+
var i = low - 1
15+
16+
for (j in low until high) {
17+
if (arr[j] <= pivot) {
18+
i++
19+
arr.swap(i, j)
20+
}
21+
}
22+
arr.swap(i + 1, high)
23+
return i + 1
24+
}
25+
26+
private fun IntArray.swap(i: Int, j: Int) {
27+
val temp = this[i]
28+
this[i] = this[j]
29+
this[j] = temp
30+
}
31+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package ru.romanow.algorithms
2+
3+
import java.util.Stack
4+
5+
class QuickSortWithoutRecursion {
6+
fun sort(arr: IntArray) {
7+
val stack = Stack<Pair<Int, Int>>()
8+
stack.push(0 to arr.size - 1)
9+
10+
while (stack.isNotEmpty()) {
11+
val (left, right) = stack.pop()
12+
13+
if (left < right) {
14+
val pivotIndex = partition(arr, left, right)
15+
if (pivotIndex - 1 > left) {
16+
stack.push(Pair(left, pivotIndex - 1))
17+
}
18+
if (pivotIndex + 1 < right) {
19+
stack.push(Pair(pivotIndex + 1, right))
20+
}
21+
}
22+
}
23+
}
24+
25+
private fun partition(arr: IntArray, low: Int, high: Int): Int {
26+
val pivot = arr[high]
27+
var i = low - 1
28+
29+
for (j in low until high) {
30+
if (arr[j] <= pivot) {
31+
i++
32+
arr.swap(i, j)
33+
}
34+
}
35+
arr.swap(i + 1, high)
36+
return i + 1
37+
}
38+
39+
private fun IntArray.swap(i: Int, j: Int) {
40+
val temp = this[i]
41+
this[i] = this[j]
42+
this[j] = temp
43+
}
44+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package ru.romanow.algorithms
2+
3+
class SelectionSort {
4+
fun sort(arr: IntArray) {
5+
val n = arr.size
6+
for (i in 0 until n - 1) {
7+
var idx = i
8+
for (j in i + 1 until n) {
9+
if (arr[j] < arr[idx]) {
10+
idx = j
11+
}
12+
}
13+
if (idx != i) {
14+
val temp = arr[i]
15+
arr[i] = arr[idx]
16+
arr[idx] = temp
17+
}
18+
}
19+
}
20+
}

src/main/kotlin/ru/romanow/FirstBadVersion.kt renamed to src/main/kotlin/ru/romanow/easy/FirstBadVersion.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ru.romanow
1+
package ru.romanow.easy
22

33
/**
44
* Вы являетесь менеджером по продукту, и в настоящее время возглавляете

src/main/kotlin/ru/romanow/FirstOccurrenceInAString.kt renamed to src/main/kotlin/ru/romanow/easy/FirstOccurrenceInAString.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ru.romanow
1+
package ru.romanow.easy
22

33
/**
44
* Даны две строки, `needle` и `haystack`, верните индекс первого

src/main/kotlin/ru/romanow/HammingWeight.kt renamed to src/main/kotlin/ru/romanow/easy/HammingWeight.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ru.romanow
1+
package ru.romanow.easy
22

33
/**
44
* Реализовать функцию, которая принимает целочисленное число без знака

0 commit comments

Comments
 (0)