added merge sort without recursion, corrected average and best times for insertion sort

This commit is contained in:
evitwilly
2022-08-24 13:40:47 +03:00
parent dd0b8df2dd
commit ee301cd471
24 changed files with 286 additions and 135 deletions

Binary file not shown.

Binary file not shown.

3
.idea/.gitignore generated vendored
View File

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

1
.idea/.name generated Normal file
View File

@ -0,0 +1 @@
Algorithms

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

2
.idea/compiler.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
<bytecodeTargetLevel target="16" />
</component>
</project>

4
.idea/gradle.xml generated
View File

@ -1,14 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="delegatedBuild" value="true" />
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="corretto-16" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />

6
.idea/kotlinc.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.6.21" />
</component>
</project>

4
.idea/misc.xml generated
View File

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_16" project-jdk-name="corretto-16" project-jdk-type="JavaSDK" />
</project>

8
.idea/modules.xml generated
View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Kotlin-Algorithms-and-Design-Patterns.iml" filepath="$PROJECT_DIR$/.idea/Kotlin-Algorithms-and-Design-Patterns.iml" />
</modules>
</component>
</project>

54
.idea/uiDesigner.xml generated
View File

@ -2,121 +2,121 @@
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>

2
.idea/vcs.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="" vcs="Git" />
</component>
</project>

7
src/main/kotlin/main.kt Normal file
View File

@ -0,0 +1,7 @@
import sorting.mergeSort
fun main() {
val array = arrayOf(5, 4, 3, 2, 1, 0)
array.mergeSort()
print(array.toList())
}

View File

@ -4,8 +4,8 @@ package sorting
* insertion sort algorithm
*
* worst time: n²
* the best time: n²
* average time: n
* the best time: n
* average time: n²
*
* amount of time: 1
*/

View File

@ -1,102 +1,105 @@
package sorting
/**
* merge sort algorithm
*
* worst time: n * log(n)
* the best time: n * log(n)
* average time: n * log(n)
*
* amount of memory: n
*/
fun <T : Comparable<T>> Array<T>.mergeSort() {
val temporaryArray = this.copyOf()
var winSize = 1
while (winSize < size) {
fun Array<Int>.mergeSort() {
val array = this
var left = 0
while (left + winSize < size) {
if (size < 2)
return
val middle = left + winSize
var right = middle + winSize
if (right > size) right = size
val mid = size / 2
var i = left
var k = left
var j = middle
while (i < middle && j < right) {
if (this[i] <= this[j]) {
temporaryArray[k] = this[i]
i++
} else {
temporaryArray[k] = this[j]
j++
}
k++
}
val left = Array(mid) { 0 }
val right = Array(size - mid) { 0 }
while (i < middle) {
temporaryArray[k] = this[i]
i++
k++
}
for (i in 0 until mid) {
left[i] = array[i]
}
while (j < right) {
temporaryArray[k] = this[j]
j++
k++
}
for (i in mid until size) {
right[i - mid] = array[i]
}
i = left
while (i < right) {
this[i] = temporaryArray[i]
i++
}
left.mergeSort()
right.mergeSort()
var i = 0; var j = 0; var k = 0
val leftSize = left.size
val rightSize = right.size
while (i < leftSize && j < rightSize) {
if (left[i] <= right[j]) {
array[k++] = left[i++]
} else {
array[k++] = right[j++]
left += winSize * 2
}
}
while (i < leftSize) {
array[k++] = left[i++]
}
while (j < rightSize) {
array[k++] = right[j++]
winSize *= 2
}
}
fun <T : Comparable<T>> MutableList<T>.mergeSort() {
val temporaryArray = this.toMutableList()
var winSize = 1
while (winSize < size) {
fun MutableList<Int>.mergeSort() {
val list = this
var left = 0
while (left + winSize < size) {
if (size < 2)
return
val middle = left + winSize
var right = middle + winSize
if (right > size) right = size
val mid = size / 2
var i = left
var k = left
var j = middle
while (i < middle && j < right) {
if (this[i] <= this[j]) {
temporaryArray[k] = this[i]
i++
} else {
temporaryArray[k] = this[j]
j++
}
k++
}
val left = Array(mid) { 0 }
val right = Array(size - mid) { 0 }
while (i < middle) {
temporaryArray[k] = this[i]
i++
k++
}
for (i in 0 until mid) {
left[i] = list[i]
}
while (j < right) {
temporaryArray[k] = this[j]
j++
k++
}
for (i in mid until size) {
right[i - mid] = list[i]
}
i = left
while (i < right) {
this[i] = temporaryArray[i]
i++
}
left.mergeSort()
right.mergeSort()
var i = 0; var j = 0; var k = 0
val leftSize = left.size
val rightSize = right.size
while (i < leftSize && j < rightSize) {
if (left[i] <= right[j]) {
list[k++] = left[i++]
} else {
list[k++] = right[j++]
left += winSize * 2
}
}
while (i < leftSize) {
list[k++] = left[i++]
winSize *= 2
}
while (j < rightSize) {
list[k++] = right[j++]
}
}
}

View File

@ -0,0 +1,99 @@
package sorting
/**
* merge sort algorithm
*
* worst time: n * log(n)
* the best time: n * log(n)
* average time: n * log(n)
*
* amount of memory: n
*/
fun Array<Int>.mergeSortRecursive() {
val array = this
if (size < 2)
return
val mid = size / 2
val left = Array(mid) { 0 }
val right = Array(size - mid) { 0 }
for (i in 0 until mid) {
left[i] = array[i]
}
for (i in mid until size) {
right[i - mid] = array[i]
}
left.mergeSortRecursive()
right.mergeSortRecursive()
var i = 0; var j = 0; var k = 0
val leftSize = left.size
val rightSize = right.size
while (i < leftSize && j < rightSize) {
if (left[i] <= right[j]) {
array[k++] = left[i++]
} else {
array[k++] = right[j++]
}
}
while (i < leftSize) {
array[k++] = left[i++]
}
while (j < rightSize) {
array[k++] = right[j++]
}
}
fun MutableList<Int>.mergeSortRecursive() {
val list = this
if (size < 2)
return
val mid = size / 2
val left = Array(mid) { 0 }
val right = Array(size - mid) { 0 }
for (i in 0 until mid) {
left[i] = list[i]
}
for (i in mid until size) {
right[i - mid] = list[i]
}
left.mergeSortRecursive()
right.mergeSortRecursive()
var i = 0; var j = 0; var k = 0
val leftSize = left.size
val rightSize = right.size
while (i < leftSize && j < rightSize) {
if (left[i] <= right[j]) {
list[k++] = left[i++]
} else {
list[k++] = right[j++]
}
}
while (i < leftSize) {
list[k++] = left[i++]
}
while (j < rightSize) {
list[k++] = right[j++]
}
}

View File

@ -0,0 +1,62 @@
package sorting
import org.junit.Test
import org.junit.jupiter.api.Assertions
class MergeSortRecursiveTest {
@Test
fun test_reversed_array() {
val expected = TestUtils.list(100000)
val actual = expected.reversed().toTypedArray()
actual.mergeSortRecursive()
Assertions.assertEquals(expected, actual.toList())
}
@Test
fun test_random_array() {
val actual = TestUtils.randomArray(50000)
val expected = actual.sorted()
actual.mergeSortRecursive()
Assertions.assertEquals(expected, actual.toList())
}
@Test
fun test_shuffled_array() {
val expected = TestUtils.sortedArray(100000)
val actual = expected.copyOf()
actual.shuffle()
actual.mergeSortRecursive()
Assertions.assertEquals(expected.toList(), actual.toList())
}
@Test
fun test_sorted_array() {
val actual = TestUtils.sortedArray(100000)
val expected = actual.toList()
actual.mergeSortRecursive()
Assertions.assertEquals(expected, actual.toList())
}
@Test
fun test_random_list() {
val actual = TestUtils.mutableRandomList(500000)
val expected = actual.sorted()
actual.mergeSortRecursive()
Assertions.assertEquals(expected, actual)
}
}

View File

@ -2,7 +2,6 @@ package sorting
import org.junit.Test
import org.junit.jupiter.api.Assertions
import kotlin.random.Random
class MergeSortTest {