Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 23 additions & 19 deletions src/sorts/exchange/StableQuickSort.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package sorts.exchange;

import java.util.ArrayList;

import main.ArrayVisualizer;
import sorts.templates.Sort;
import utils.ArrayVList;

/*
*
*
MIT License

Copyright (c) 2017 Rodney Shaghoulian
Expand All @@ -32,9 +31,11 @@ of this software and associated documentation files (the "Software"), to deal
*/

final public class StableQuickSort extends Sort {
private int length;

public StableQuickSort(ArrayVisualizer arrayVisualizer) {
super(arrayVisualizer);

this.setSortListName("Stable Quick");
this.setRunAllSortsName("Stable Quick Sort");
this.setRunSortName("Stable Quicksort");
Expand All @@ -50,42 +51,44 @@ public StableQuickSort(ArrayVisualizer arrayVisualizer) {
// Author: Rodney Shaghoulian
// Github: github.com/RodneyShag

private void copy(ArrayList<Integer> list, int [] array, int startIndex) {
private void copy(ArrayVList list, int [] array, int startIndex) {
for (int num : list) {
Writes.write(array, startIndex++, num, 0.25, false, false);
Highlights.markArray(1, startIndex);
}
}

/* Partition/Quicksort "Stable Sort" version using O(n) space */
private int stablePartition(int[] array, int start, int end) {
int pivotValue = array[start]; //poor pivot choice
Highlights.markArray(3, start);
ArrayList<Integer> leftList = new ArrayList<>();
ArrayList<Integer> rightList = new ArrayList<>();

ArrayVList leftList = Writes.createArrayList(this.length);
ArrayVList rightList = Writes.createArrayList(this.length);

for (int i = start + 1 ; i <= end; i++) {
Highlights.markArray(1, i);

if (Reads.compareValues(array[i], pivotValue) == -1) {
Writes.mockWrite(end - start, leftList.size(), array[i], 0.25);
Writes.arrayListAdd(leftList, array[i]);
}
// Writes.mockWrite(end - start, leftList.size(), array[i], 0.25);
// Writes.arrayListAdd(leftList, array[i]);
leftList.add(array[i], 0.25, false);
}
else {
Writes.mockWrite(end - start, rightList.size(), array[i], 0.25);
Writes.arrayListAdd(rightList, array[i]);
// Writes.mockWrite(end - start, rightList.size(), array[i], 0.25);
// Writes.arrayListAdd(rightList, array[i]);
rightList.add(array[i], 0.25, false);
}
}

/* Recreate array */
this.copy(leftList, array, start);

int newPivotIndex = start + leftList.size();

Writes.write(array, newPivotIndex, pivotValue, 0.25, false, false);
Highlights.markArray(1, newPivotIndex);

this.copy(rightList, array, newPivotIndex + 1);

Writes.deleteArrayList(leftList);
Expand All @@ -101,9 +104,10 @@ private void stableQuickSort(int [] array, int start, int end) {
this.stableQuickSort(array, pivotIndex + 1, end);
}
}

@Override
public void runSort(int[] array, int length, int bucketCount) {
this.length = length;
this.stableQuickSort(array, 0, length - 1);
}
}
38 changes: 19 additions & 19 deletions src/sorts/exchange/StableQuickSortMiddlePivot.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package sorts.exchange;

import java.util.ArrayList;

import main.ArrayVisualizer;
import sorts.templates.Sort;
import utils.ArrayVList;

/*
*
*
MIT License

Copyright (c) 2017 Rodney Shaghoulian
Expand All @@ -33,9 +32,11 @@ of this software and associated documentation files (the "Software"), to deal
*/

final public class StableQuickSortMiddlePivot extends Sort {
private int length;

public StableQuickSortMiddlePivot(ArrayVisualizer arrayVisualizer) {
super(arrayVisualizer);

this.setSortListName("Stable Quick (Middle Pivot)");
this.setRunAllSortsName("Stable Quick Sort (Middle Pivot)");
this.setRunSortName("Stable Quicksort (Middle Pivot)");
Expand All @@ -54,45 +55,43 @@ public StableQuickSortMiddlePivot(ArrayVisualizer arrayVisualizer) {
// Author: Josiah Glosson
// Github: github.com/gaming32

private void copy(ArrayList<Integer> list, int [] array, int startIndex) {
private void copy(ArrayVList list, int [] array, int startIndex) {
for (int num : list) {
Writes.write(array, startIndex++, num, 0.25, false, false);
Highlights.markArray(1, startIndex);
}
}

/* Partition/Quicksort "Stable Sort" version using O(n) space */
private int stablePartition(int[] array, int start, int end) {
int pivot = start + (end - start) / 2;
int pivotValue = array[pivot];
Highlights.markArray(3, start);
Highlights.markArray(4, pivot);
ArrayList<Integer> leftList = new ArrayList<>();
ArrayList<Integer> rightList = new ArrayList<>();

ArrayVList leftList = Writes.createArrayList(this.length);
ArrayVList rightList = Writes.createArrayList(this.length);

for (int i = start ; i <= end; i++) {
Highlights.markArray(1, i);
if (i == pivot) continue;

if (Reads.compareValues(array[i], pivotValue) == -1) {
Writes.mockWrite(end - start, leftList.size(), array[i], 0.25);
Writes.arrayListAdd(leftList, array[i]);
}
Writes.arrayListAdd(leftList, array[i], true, 0.25);
}
else {
Writes.mockWrite(end - start, rightList.size(), array[i], 0.25);
Writes.arrayListAdd(rightList, array[i]);
Writes.arrayListAdd(rightList, array[i], true, 0.25);
}
}

/* Recreate array */
this.copy(leftList, array, start);

int newPivotIndex = start + leftList.size();

Writes.write(array, newPivotIndex, pivotValue, 0.25, false, false);
Highlights.markArray(1, newPivotIndex);

this.copy(rightList, array, newPivotIndex + 1);

Writes.deleteArrayList(leftList);
Expand All @@ -108,9 +107,10 @@ private void stableQuickSort(int [] array, int start, int end) {
this.stableQuickSort(array, pivotIndex + 1, end);
}
}

@Override
public void runSort(int[] array, int length, int bucketCount) {
this.length = length;
this.stableQuickSort(array, 0, length - 1);
}
}
48 changes: 25 additions & 23 deletions src/sorts/hybrid/DropMergeSort.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package sorts.hybrid;

import sorts.templates.Sort;
import utils.ArrayVList;
import main.ArrayVisualizer;

import sorts.hybrid.PDQBranchedSort;

import java.util.ArrayList;
import java.util.List;

/*
*
*
MIT License
Copyright (c) 2020 fungamer2 and Emil Ernerfeldt
Permission is hereby granted, free of charge, to any person obtaining a copy
Expand All @@ -32,7 +34,7 @@ of this software and associated documentation files (the "Software"), to deal
final public class DropMergeSort extends Sort {
public DropMergeSort(ArrayVisualizer arrayVisualizer) {
super(arrayVisualizer);

this.setSortListName("Drop Merge");
this.setRunAllSortsName("Drop Merge Sort");
this.setRunSortName("Drop Mergesort");
Expand All @@ -44,47 +46,47 @@ public DropMergeSort(ArrayVisualizer arrayVisualizer) {
this.setUnreasonableLimit(0);
this.setBogoSort(false);
}

private final int RECENCY = 8;
private final int EARLY_OUT_TEST_AT = 4;
private final double EARLY_OUT_DISORDER_FRACTION = 0.6;
private void truncateArrayList(ArrayList<Integer> arrayList, int len) {

private void truncateArrayList(List<Integer> arrayList, int len) {
int size = arrayList.size();
arrayList.subList(len, size).clear();
Writes.changeAllocAmount(len - size);
}

@Override
public void runSort(int[] array, int length, int bucketCount) {
if (length < 2) return;

PDQBranchedSort pdqSort = new PDQBranchedSort(arrayVisualizer);
ArrayList<Integer> dropped = new ArrayList<>(length);
List<Integer> dropped = Writes.createArrayList(length);

int num_dropped_in_a_row = 0;
int read = 0;
int write = 0;

int iteration = 0;
int early_out_stop = length / EARLY_OUT_TEST_AT;

while (read < length) {
Highlights.markArray(2, read);
iteration += 1;
if (iteration == early_out_stop && dropped.size() > read * EARLY_OUT_DISORDER_FRACTION) {
// We have seen a lot of the elements and dropped a lot of them.
// This doesn't look good. Abort.
Highlights.clearMark(2);

for (int i = 0; i < dropped.size(); i++) {
Writes.write(array, write++, dropped.get(i), 1, true, false);
}
Writes.arrayListClear(dropped);
pdqSort.customSort(array, 0, length);
Writes.deleteArrayList(dropped);
return;
}

if (write == 0 || Reads.compareIndices(array, read, write - 1, 0, false) >= 0) {
// The element is order - keep it:
Writes.write(array, write++, array[read++], 1, true, false);
Expand Down Expand Up @@ -136,24 +138,24 @@ public void runSort(int[] array, int length, int bucketCount) {
}
}
}

Highlights.clearMark(2);

for (int i = 0; i < dropped.size(); i++) {
Writes.write(array, write + i, dropped.get(i), 1, true, false);
}

pdqSort.customSort(array, write, length);


int[] buffer = Writes.createExternalArray(dropped.size());

Writes.arraycopy(array, write, buffer, 0, dropped.size(), 1, true, true);

int i = buffer.length - 1;
int j = write - 1;
int k = length - 1;

while (i >= 0) {
if (j < 0 || Reads.compareValues(buffer[i], array[j]) == 1) {
Writes.write(array, k--, buffer[i--], 1, true, false);
Expand All @@ -162,7 +164,7 @@ public void runSort(int[] array, int length, int bucketCount) {
Writes.write(array, k--, array[j--], 1, true, false);
}
}

Writes.deleteArrayList(dropped);
Writes.deleteExternalArray(buffer);
}
Expand Down
14 changes: 7 additions & 7 deletions src/sorts/select/AnarchySort.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package sorts.select;

import java.util.ArrayList;

import main.ArrayVisualizer;
import sorts.templates.Sort;
import utils.ArrayVList;

public final class AnarchySort extends Sort {

Expand All @@ -22,13 +21,13 @@ public AnarchySort(ArrayVisualizer arrayVisualizer) {

}

private boolean containsValue(ArrayList<Integer> list, int value) {
private boolean containsValue(ArrayVList list, int value) {
for (int at = 0; at < list.size(); at++) {
this.Delays.sleep(0.001D);
this.Highlights.markArray(1, at);

this.Writes.startLap();
boolean comp = (((Integer) list.get(at)).intValue() == value);
boolean comp = list.get(at) == value;
this.Writes.stopLap();

if (comp)
Expand Down Expand Up @@ -59,7 +58,7 @@ private void convert(int[] array, int[] aux, int length) {
this.Writes.write(aux, init, array[init], 0.001D, true, true);
}

ArrayList<Integer> t2 = new ArrayList<>();
ArrayVList t2 = Writes.createArrayList(length);
int m = 0;

while (m < length) {
Expand All @@ -71,14 +70,15 @@ private void convert(int[] array, int[] aux, int length) {
}
i++;
}
this.Writes.changeAuxWrites(1);
t2.add(Integer.valueOf(j));
t2.add(j);
this.Highlights.markArray(1, j);
this.Delays.sleep(1.0D);

this.Writes.write(array, j, m, 1.0D, true, false);
m++;
}

Writes.deleteArrayList(t2);
}

private void sortMainAndAux(int[] array, int[] aux, int length) {
Expand Down
Loading