Skip to content

Instantly share code, notes, and snippets.

@denkspuren
Last active October 26, 2022 12:41
Show Gist options
  • Save denkspuren/370a69f51ab2cc1ad7e3f14baa50510c to your computer and use it in GitHub Desktop.
Save denkspuren/370a69f51ab2cc1ad7e3f14baa50510c to your computer and use it in GitHub Desktop.
Quicksort, in place sorting with an array
// Quicksort, in place sorting -- according to
// https://www.youtube.com/watch?v=MZaf_9IZCrc
void swap(int[] numbers, int i, int j) {
int tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
void shift(int[] numbers, int from, int to) {
int tmp = numbers[to];
for (int i = to - 1; i >= from; i--)
numbers[i + 1] = numbers[i];
numbers[from] = tmp;
}
void qs(int[] numbers, int first, int last) {
if (first >= last) return;
int i = first - 1;
for (int j = first; j < last; j++) {
if (numbers[j] < numbers[last]) {
i = i + 1;
swap(numbers, i, j);
}
}
shift(numbers, i + 1, last);
qs(numbers, first, i);
qs(numbers, i + 2, last);
}
int[] quicksort(int[] numbers) {
qs(numbers, 0, numbers.length - 1);
return numbers;
}
// Beispielanwendung:
//
// jshell> quicksort(new int[]{7, 2, 1, 8, 6, 3, 5, 4})
// $9 ==> int[8] { 1, 2, 3, 4, 5, 6, 7, 8 }
// Testing
AssertionError ae;
try { assert false; }
catch (AssertionError exception) { ae = exception; }
if (ae == null) System.out.println("WARNING: Turn assertions on, call \"jshell -R-ea\"");
int[] numbers = new int[]{};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{});
numbers = new int[]{7};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{7});
numbers = new int[]{1, 1};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 1});
numbers = new int[]{1, 2};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2});
numbers = new int[]{2, 1};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2});
numbers = new int[]{1, 2, 3};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2, 3});
numbers = new int[]{1, 3, 2};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2, 3});
numbers = new int[]{2, 1, 3};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2, 3});
numbers = new int[]{2, 3, 1};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2, 3});
numbers = new int[]{3, 1, 2};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2, 3});
numbers = new int[]{3, 2, 1};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 2, 3});
numbers = new int[]{3, 3, 1};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 3, 3});
numbers = new int[]{1, 3, 3};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 3, 3});
numbers = new int[]{3, 3, 1};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{1, 3, 3});
numbers = new int[]{5, 3, 3};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{3, 3, 5});
numbers = new int[]{3, 3, 5};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{3, 3, 5});
numbers = new int[]{3, 3, 3};
qs(numbers, 0, numbers.length - 1);
assert Arrays.equals(numbers, new int[]{3, 3, 3});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment