added merge sort without recursion, corrected average and best times for insertion sort
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
3
.idea/.gitignore
generated
vendored
3
.idea/.gitignore
generated
vendored
@ -1,3 +0,0 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
@ -0,0 +1 @@
|
||||
Algorithms
|
||||
9
.idea/Kotlin-Algorithms-and-Design-Patterns.iml
generated
9
.idea/Kotlin-Algorithms-and-Design-Patterns.iml
generated
@ -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
2
.idea/compiler.xml
generated
@ -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
4
.idea/gradle.xml
generated
@ -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
6
.idea/kotlinc.xml
generated
Normal 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
4
.idea/misc.xml
generated
@ -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
8
.idea/modules.xml
generated
@ -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
54
.idea/uiDesigner.xml
generated
@ -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
2
.idea/vcs.xml
generated
@ -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
7
src/main/kotlin/main.kt
Normal file
@ -0,0 +1,7 @@
|
||||
import sorting.mergeSort
|
||||
|
||||
fun main() {
|
||||
val array = arrayOf(5, 4, 3, 2, 1, 0)
|
||||
array.mergeSort()
|
||||
print(array.toList())
|
||||
}
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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++]
|
||||
}
|
||||
}
|
||||
}
|
||||
99
src/main/kotlin/sorting/MergeSortRecursive.kt
Normal file
99
src/main/kotlin/sorting/MergeSortRecursive.kt
Normal 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++]
|
||||
}
|
||||
}
|
||||
62
src/test/kotlin/sorting/MergeSortRecursiveTest.kt
Normal file
62
src/test/kotlin/sorting/MergeSortRecursiveTest.kt
Normal 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)
|
||||
}
|
||||
|
||||
}
|
||||
@ -2,7 +2,6 @@ package sorting
|
||||
|
||||
import org.junit.Test
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import kotlin.random.Random
|
||||
|
||||
class MergeSortTest {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user