From 8aa3bf1b6cbc8cfa995e7984b4ae10aa8e859402 Mon Sep 17 00:00:00 2001 From: Paul H Date: Tue, 25 Mar 2025 21:05:46 +0100 Subject: [PATCH] Added merge sort --- list/.idea/uiDesigner.xml | 124 ++++++++++++++++++ list/src/main/java/de/vivi/list/Main.java | 7 +- .../java/de/vivi/list/list/ArrayByteList.java | 5 + .../main/java/de/vivi/list/list/ByteList.java | 2 + .../de/vivi/list/list/LinkedByteList.java | 5 + .../java/de/vivi/list/sort/BubbleSort.java | 2 - .../java/de/vivi/list/sort/MergeSort.java | 60 +++++++++ 7 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 list/.idea/uiDesigner.xml create mode 100644 list/src/main/java/de/vivi/list/sort/MergeSort.java diff --git a/list/.idea/uiDesigner.xml b/list/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/list/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/list/src/main/java/de/vivi/list/Main.java b/list/src/main/java/de/vivi/list/Main.java index 8824ab0..499a288 100644 --- a/list/src/main/java/de/vivi/list/Main.java +++ b/list/src/main/java/de/vivi/list/Main.java @@ -5,6 +5,7 @@ import de.vivi.list.list.ByteList; import de.vivi.list.list.LinkedByteList; import de.vivi.list.sort.BubbleSort; import de.vivi.list.sort.ByteSort; +import de.vivi.list.sort.MergeSort; public class Main { @@ -85,12 +86,12 @@ public class Main { private static void testSort(ByteList list) { ByteSort bubble = new BubbleSort(); -// ByteSort merge = new MergeSort(); + ByteSort merge = new MergeSort(); // ByteSort bogo = new BogoSort(); // // // sort the lists with the sorting algorithm - bubble.sort(list); -// merge.sort(list.copy()); +// bubble.sort(list); + merge.sort(list); // bogo.sort(list.copy()); } } diff --git a/list/src/main/java/de/vivi/list/list/ArrayByteList.java b/list/src/main/java/de/vivi/list/list/ArrayByteList.java index 7e4b371..fb1549c 100644 --- a/list/src/main/java/de/vivi/list/list/ArrayByteList.java +++ b/list/src/main/java/de/vivi/list/list/ArrayByteList.java @@ -47,6 +47,11 @@ public class ArrayByteList implements ByteList { values[index] = value; } + @Override + public void clear() { + values = new byte[0]; + } + @Override public int size() { return values.length; diff --git a/list/src/main/java/de/vivi/list/list/ByteList.java b/list/src/main/java/de/vivi/list/list/ByteList.java index 57eba75..dedcc39 100644 --- a/list/src/main/java/de/vivi/list/list/ByteList.java +++ b/list/src/main/java/de/vivi/list/list/ByteList.java @@ -12,5 +12,7 @@ public interface ByteList extends Iterable { void set(int index, byte value); + void clear(); + int size(); } diff --git a/list/src/main/java/de/vivi/list/list/LinkedByteList.java b/list/src/main/java/de/vivi/list/list/LinkedByteList.java index 733fe01..99f7023 100644 --- a/list/src/main/java/de/vivi/list/list/LinkedByteList.java +++ b/list/src/main/java/de/vivi/list/list/LinkedByteList.java @@ -114,6 +114,11 @@ public class LinkedByteList implements ByteList { entry.value = value; } + @Override + public void clear() { + root = null; + } + @Override public int size() { return size; diff --git a/list/src/main/java/de/vivi/list/sort/BubbleSort.java b/list/src/main/java/de/vivi/list/sort/BubbleSort.java index 861edc8..c19457f 100644 --- a/list/src/main/java/de/vivi/list/sort/BubbleSort.java +++ b/list/src/main/java/de/vivi/list/sort/BubbleSort.java @@ -20,8 +20,6 @@ public class BubbleSort implements ByteSort { list.set(i + 1, temp); } } - - System.out.println(list); } } } diff --git a/list/src/main/java/de/vivi/list/sort/MergeSort.java b/list/src/main/java/de/vivi/list/sort/MergeSort.java new file mode 100644 index 0000000..a4f8346 --- /dev/null +++ b/list/src/main/java/de/vivi/list/sort/MergeSort.java @@ -0,0 +1,60 @@ +package de.vivi.list.sort; + +import de.vivi.list.list.ArrayByteList; +import de.vivi.list.list.ByteList; + +public class MergeSort implements ByteSort { + + @Override + public void sort(ByteList list) { + if (list.size() <= 1) { + return; + } + + ByteList left = new ArrayByteList(); + ByteList right = new ArrayByteList(); + + split(list, left, right); + + if (left.size() > 1) { + sort(left); + } + + if (right.size() > 1) { + sort(right); + } + + int leftIndex = 0; + int rightIndex = 0; + + while (leftIndex < left.size() && rightIndex < right.size()) { + if (left.get(leftIndex) < right.get(rightIndex)) { + list.add(left.get(leftIndex++)); + } else { + list.add(right.get(rightIndex++)); + } + } + + while (leftIndex < left.size()) { + list.add(left.get(leftIndex++)); + } + + while (rightIndex < right.size()) { + list.add(right.get(rightIndex++)); + } + } + + private void split(ByteList list, ByteList left, ByteList right) { + int half = list.size() >> 1; // divide by two + + for (int i = 0; i < list.size(); i++) { + if (i < half) { + left.add(list.get(i)); + } else { + right.add(list.get(i)); + } + } + + list.clear(); + } +}