diff --git a/.gitignore b/.gitignore index 7c1979f..0e9bfcc 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ local.properties # PDT-specific .buildpath + +.idea/ +out/ diff --git a/README.md b/README.md index 2b71007..c4f721c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ SortingAlgorithmAnimations ========================== -Watch video http://youtu.be/ZZuD6iUe3Pc - -Download binary .jar: http://bohush.net/sorting.jar +Watch video https://www.youtube.com/watch?v=14oa9QBT5Js Visualization and comparison of 9 different sorting algorithms: - selection sort diff --git a/sorting.iml b/sorting.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/sorting.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/net/bohush/sorting/BubbleSortPanel.java b/src/net/bohush/sorting/BubbleSortPanel.java index ee3221c..35f4b38 100644 --- a/src/net/bohush/sorting/BubbleSortPanel.java +++ b/src/net/bohush/sorting/BubbleSortPanel.java @@ -46,32 +46,5 @@ public void run() { } repaint(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = 0; i < (greenColumn == -1 ? list.length : greenColumn); i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if(greenColumn != -1) { - for (int i = greenColumn; i < list.length; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - } } diff --git a/src/net/bohush/sorting/CocktailSortPanel.java b/src/net/bohush/sorting/CocktailSortPanel.java index 5b7dc3f..31c6c04 100644 --- a/src/net/bohush/sorting/CocktailSortPanel.java +++ b/src/net/bohush/sorting/CocktailSortPanel.java @@ -68,40 +68,4 @@ public void run() { } repaint(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = (greenColumn1 == -1 ? 0 : greenColumn1); i < (greenColumn2 == -1 ? list.length : greenColumn2); i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if(greenColumn2 != -1) { - for (int i = greenColumn2; i < list.length; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - } - if(greenColumn1 != -1) { - for (int i = 0; i < greenColumn1; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - } - } diff --git a/src/net/bohush/sorting/CombSortPanel.java b/src/net/bohush/sorting/CombSortPanel.java index 06ad9e6..cdc4879 100644 --- a/src/net/bohush/sorting/CombSortPanel.java +++ b/src/net/bohush/sorting/CombSortPanel.java @@ -63,36 +63,5 @@ public void run() { } repaint(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = (greenColumn == -1 ? 0 : greenColumn); i < list.length; i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - for (int i = 0; i <= greenColumn; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - if(blueColumn != -1) { - g.setColor(Color.BLUE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - } - } } diff --git a/src/net/bohush/sorting/HeapSortPanel.java b/src/net/bohush/sorting/HeapSortPanel.java index 069d055..6721ec4 100644 --- a/src/net/bohush/sorting/HeapSortPanel.java +++ b/src/net/bohush/sorting/HeapSortPanel.java @@ -1,7 +1,6 @@ package net.bohush.sorting; -import java.awt.Color; -import java.awt.Graphics; +import java.awt.*; public class HeapSortPanel extends SortPanel { private static final long serialVersionUID = 1L; @@ -46,37 +45,29 @@ public void run() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); + + Graphics2D g2d = (Graphics2D) g; int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; + int y = getHeight() - size * columnHeight - 3 * BORDER_WIDTH; + int height = size * columnHeight; + for (int i = 0; i < list.length; i++) { + g2d.fillRect(2 * BORDER_WIDTH + columnWidth * i, y, columnWidth, height); + } + + + for (int i = heapList.size(); i < list.length; i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); + g2d.setPaint(getGradientPaint(i, list[i], columnWidth)); + g.fillRect(2 * BORDER_WIDTH + columnWidth * i, y, columnWidth, height); } for (int i = 0; i < heapList.size(); i++) { - g.setColor(Color.CYAN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - heapList.get(i) * columnHeight - 2 * BORDER_WIDTH, columnWidth, heapList.get(i) * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - heapList.get(i) * columnHeight - 2 * BORDER_WIDTH, columnWidth, heapList.get(i) * columnHeight); - } - - if(greenColumn != -1) { - for (int i = greenColumn; i < size; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - heapList.get(redColumn) * columnHeight - 2 * BORDER_WIDTH, columnWidth, heapList.get(redColumn) * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - heapList.get(redColumn) * columnHeight - 2 * BORDER_WIDTH, columnWidth, heapList.get(redColumn) * columnHeight); + g2d.setPaint(getGradientPaint(i, heapList.get(i), columnWidth)); + g.fillRect(2 * BORDER_WIDTH + columnWidth * i, y, columnWidth, height); } + } - + /** Add a new object into the heap * @throws InterruptedException */ public void add(Integer newObject) throws InterruptedException { diff --git a/src/net/bohush/sorting/InsertionSortPanel.java b/src/net/bohush/sorting/InsertionSortPanel.java index 9337b07..3d9d957 100644 --- a/src/net/bohush/sorting/InsertionSortPanel.java +++ b/src/net/bohush/sorting/InsertionSortPanel.java @@ -43,30 +43,5 @@ public void run() { } repaint(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = (greenColumn == -1 ? 0 : greenColumn); i < list.length; i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - for (int i = 0; i <= greenColumn; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - } } diff --git a/src/net/bohush/sorting/Main.java b/src/net/bohush/sorting/Main.java index 87ff2da..49d43c7 100644 --- a/src/net/bohush/sorting/Main.java +++ b/src/net/bohush/sorting/Main.java @@ -46,12 +46,20 @@ class SortPanelsHolder extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); - g.setColor(Color.WHITE); Font animationNameFont = new Font(Font.MONOSPACED, Font.BOLD, 150); FontMetrics animationNameFontFontMetrix = getFontMetrics(animationNameFont); g.setFont(animationNameFont); int x = (getWidth() - animationNameFontFontMetrix.stringWidth(animationName)) / 2; int y = (getHeight() - animationNameFontFontMetrix.getLeading()) / 2; + + float startH = (float)Math.random() / 2; + float finishH = 0.5f + (float)Math.random() / 2; + float S = 1; // Saturation + float B = 1; // Brightness + Color startColor = Color.getHSBColor(startH, S, B); + Color finishColor = Color.getHSBColor(finishH, S, B); + GradientPaint gradientPaint = new GradientPaint(x, 0, startColor, x + animationNameFontFontMetrix.stringWidth(animationName), 0,finishColor); + ((Graphics2D)g).setPaint(gradientPaint); g.drawString(animationName, x, y); } } @@ -61,7 +69,7 @@ public void beginAnimation(String animationName, int[] list) { this.animationName = animationName; repaint(); - Thread.sleep(2000); + Thread.sleep(3000); this.animationName = ""; repaint(); for (int i = 0; i < sortPanels.length; i++) { @@ -110,18 +118,6 @@ public static void main(String[] args) { } main.beginAnimation("Random", list); - for (int i = 0; i < list.length; i++) { - list[i] = (1 + i / (size / 4) ) * (size / 4); - } - for (int i = 0; i < list.length; i++) { - int index = (int) (Math.random() * list.length); - int temp = list[i]; - list[i] = list[index]; - list[index] = temp; - } - main.beginAnimation("Few Unique", list); - - for (int i = 0; i < list.length; i++) { list[i] = size - i; } diff --git a/src/net/bohush/sorting/MergeSortPanel.java b/src/net/bohush/sorting/MergeSortPanel.java index 7eca62c..ea2c9df 100644 --- a/src/net/bohush/sorting/MergeSortPanel.java +++ b/src/net/bohush/sorting/MergeSortPanel.java @@ -96,38 +96,4 @@ public void merge(int start1, int fin1, int start2, int fin2) throws Interrupted greenColumnFinish = -1; } - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = 0; i < list.length; i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if((greenColumnStart != -1)&&(greenColumnFinish != -1)) { - for (int i = greenColumnStart; i <= greenColumnFinish; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - if(blueColumn != -1) { - g.setColor(Color.BLUE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - } - - } - } diff --git a/src/net/bohush/sorting/QuickSortPanel.java b/src/net/bohush/sorting/QuickSortPanel.java index beb92da..3d65e39 100644 --- a/src/net/bohush/sorting/QuickSortPanel.java +++ b/src/net/bohush/sorting/QuickSortPanel.java @@ -1,130 +1,91 @@ package net.bohush.sorting; -import java.awt.Color; -import java.awt.Graphics; +import javafx.util.Pair; + +import java.awt.*; public class QuickSortPanel extends SortPanel { - private static final long serialVersionUID = 1L; - private int redColumn = -1; - private int blueColumn = -1; - private int cyanColumn = -1; - private int greenColumn = -1; - - public QuickSortPanel(String name, int sleepTime, int width, int height) { - super(name, sleepTime, width, height); - } + private static final long serialVersionUID = 1L; + private int redColumn = -1; + private int blueColumn = -1; + private int cyanColumn = -1; + private int greenColumn = -1; - @Override - public void reset() { - redColumn = -1; - blueColumn = -1; - greenColumn = -1; - cyanColumn = -1; - } + public QuickSortPanel(String name, int sleepTime, int width, int height) { + super(name, sleepTime, width, height); + } - @Override - public void run() { - try { - quicksort(0, list.length - 1); - } catch (InterruptedException e) { - } - redColumn = -1; - blueColumn = -1; - cyanColumn = -1; - greenColumn = size - 1; - repaint(); - } - - private void quicksort(int low, int high) throws InterruptedException { - int i = low; - int j = high; - Thread.sleep(sleepTime); - repaint(); - int pivot = list[low + (high - low) / 2]; - redColumn = low + (high - low) / 2; - - while (i <= j) { - while (list[i] < pivot) { - i++; - blueColumn = i; - Thread.sleep(4 * sleepTime); - repaint(); - } - while (list[j] > pivot) { - j--; - cyanColumn = j; - Thread.sleep(4 * sleepTime); - repaint(); - } + @Override + public void reset() { + redColumn = -1; + blueColumn = -1; + greenColumn = -1; + cyanColumn = -1; + } - if (i <= j) { - int temp = list[i]; - list[i] = list[j]; - list[j] = temp; - if(i == redColumn) { - redColumn = j; - } else if (j == redColumn) { - redColumn = i; - } - Thread.sleep(4 * sleepTime); - repaint(); - i++; - j--; - } - } + @Override + public void run() { + try { + quicksort(0, list.length - 1); + } catch (InterruptedException e) { + } + redColumn = -1; + blueColumn = -1; + cyanColumn = -1; + greenColumn = size - 1; + repaint(); + } - if (low < j) { - quicksort(low, j); - } - if (i < high) { - quicksort(i, high); - } - if(low > greenColumn) { - greenColumn = low; - blueColumn = -1; - cyanColumn = -1; - } - repaint(); - } + private void quicksort(int low, int high) throws InterruptedException { + int i = low; + int j = high; + Thread.sleep(sleepTime); + repaint(); + int pivot = list[low + (high - low) / 2]; + redColumn = low + (high - low) / 2; - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = (greenColumn == -1 ? 0 : greenColumn); i < list.length; i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - for (int i = 0; i <= greenColumn; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - if(blueColumn != -1) { - g.setColor(Color.BLUE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - } - if(cyanColumn != -1) { - g.setColor(Color.CYAN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * cyanColumn, getHeight() - list[cyanColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[cyanColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * cyanColumn, getHeight() - list[cyanColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[cyanColumn] * columnHeight); - } + while (i <= j) { + while (list[i] < pivot) { + i++; + blueColumn = i; + Thread.sleep(4 * sleepTime); + repaint(); + } + while (list[j] > pivot) { + j--; + cyanColumn = j; + Thread.sleep(4 * sleepTime); + repaint(); + } + if (i <= j) { + int temp = list[i]; + list[i] = list[j]; + list[j] = temp; + if (i == redColumn) { + redColumn = j; + } else if (j == redColumn) { + redColumn = i; + } + Thread.sleep(4 * sleepTime); + repaint(); + i++; + j--; + } + } - } + if (low < j) { + quicksort(low, j); + } + if (i < high) { + quicksort(i, high); + } + if (low > greenColumn) { + greenColumn = low; + blueColumn = -1; + cyanColumn = -1; + } + repaint(); + } } diff --git a/src/net/bohush/sorting/SelectionSortPanel.java b/src/net/bohush/sorting/SelectionSortPanel.java index f432211..849dd24 100644 --- a/src/net/bohush/sorting/SelectionSortPanel.java +++ b/src/net/bohush/sorting/SelectionSortPanel.java @@ -1,7 +1,6 @@ package net.bohush.sorting; -import java.awt.Color; -import java.awt.Graphics; +import java.awt.*; public class SelectionSortPanel extends SortPanel { private static final long serialVersionUID = 1L; @@ -54,37 +53,5 @@ public void run() { } repaint(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = (greenColumn == -1 ? 0 : greenColumn); i < list.length; i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - for (int i = 0; i <= greenColumn; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - if(blueColumn != -1) { - g.setColor(Color.BLUE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - } - - } } diff --git a/src/net/bohush/sorting/ShellSortPanel.java b/src/net/bohush/sorting/ShellSortPanel.java index a0eb09d..a7cb77e 100644 --- a/src/net/bohush/sorting/ShellSortPanel.java +++ b/src/net/bohush/sorting/ShellSortPanel.java @@ -60,36 +60,5 @@ public void run() { } repaint(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; - int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; - for (int i = (greenColumn == -1 ? 0 : greenColumn); i < list.length; i++) { - g.setColor(Color.WHITE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - for (int i = 0; i <= greenColumn; i++) { - g.setColor(Color.GREEN); - g.fillRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * i, getHeight() - list[i] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[i] * columnHeight); - } - if(redColumn != -1) { - g.setColor(Color.RED); - g.fillRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * redColumn, getHeight() - list[redColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[redColumn] * columnHeight); - } - if(blueColumn != -1) { - g.setColor(Color.BLUE); - g.fillRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - g.setColor(Color.BLACK); - g.drawRect(2 * BORDER_WIDTH + columnWidth * blueColumn, getHeight() - list[blueColumn] * columnHeight - 2 * BORDER_WIDTH, columnWidth, list[blueColumn] * columnHeight); - } - } } diff --git a/src/net/bohush/sorting/SortPanel.java b/src/net/bohush/sorting/SortPanel.java index e2bd6d5..25cbaf9 100644 --- a/src/net/bohush/sorting/SortPanel.java +++ b/src/net/bohush/sorting/SortPanel.java @@ -1,10 +1,8 @@ package net.bohush.sorting; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; +import javafx.util.Pair; + +import java.awt.*; import javax.swing.JPanel; @@ -53,6 +51,15 @@ protected void paintComponent(Graphics g) { g.setFont(nameFont); g.drawString(name, (getWidth() - nameFontMetrix.stringWidth(name)) / 2, BORDER_WIDTH + nameFontMetrix.getAscent() / 3); + Graphics2D g2d = (Graphics2D) g; + int columnWidth = (getWidth() - 4 * BORDER_WIDTH) / size; + int columnHeight = (getHeight() - 4 * BORDER_WIDTH) / size; + int y = getHeight() - size * columnHeight - 3 * BORDER_WIDTH; + int height = size * columnHeight; + for (int i = 0; i < list.length; i++) { + g2d.setPaint(getGradientPaint(i, list[i], columnWidth)); + g2d.fillRect(2 * BORDER_WIDTH + columnWidth * i, y, columnWidth, height); + } } @Override @@ -60,4 +67,15 @@ protected void paintComponent(Graphics g) { public abstract void reset(); + protected GradientPaint getGradientPaint(int position, int value, int columnWidth) { + float startH = value / (size * 1f); + float finishH = (value + 1) / (size * 1f); + float S = 1; // Saturation + float B = 1; // Brightness + Color startColor = Color.getHSBColor(startH, S, B); + Color finishColor = Color.getHSBColor(finishH, S, B); + int x = 2 * BORDER_WIDTH + columnWidth * position; + return new GradientPaint(x, 0, startColor, x + columnWidth, 0,finishColor); + } + }