Code
function quickSort(a) {
let step = 0;
let pivot = -1;
if (a !== undefined && a !== null) {
sort(a, 0, a.length - 1);
printStep(++step, a, -1, -1, pivot);
}
function partition(a, n, i, j) {
while (a[i] < n && i < j) {
i++;
}
while (a[j] >= n && j > i) {
j--;
}
if (i < j) {
printSwap(a, i, j);
let tmp = a[i];
a[i] = a[j];
a[j] = tmp;
if (i + 1 === j) {
return i;
}
else {
return partition(a, n, i + 1, j - 1);
}
}
else { // i and j are equal
return a[i] < n ? i : i - 1;
}
}
function sort(a, first, last) {
printStep(++step, a, first, last, pivot);
let n = a[first];
let i = first + 1;
let j = last;
let k = partition(a, n, i, j);
pivot = k;
if (k > first) {
printSwap(a, first, k);
a[first] = a[k];
a[k] = n;
}
if (k - 1 > first) {
sort(a, first, k - 1);
}
if (k + 1 < last) {
sort(a, k + 1, last);
}
}
function printStep(s, a, i, j, p) {
let k = undefined;
let str = 'Step ' + s + ': '
while (str.length < 9) str = ' ' + str;
for (k = 0; k < a.length; k++) {
if (k > 0) str += ',';
if (k === i) str += '[';
if (k === p) str += '|';
str += a[k];
if (k === j) str += ']';
if (k === p) str += '|';
}
console.log(str);
}
function printSwap(a, i, j) {
let k = undefined;
let str = ' ' + i + '⇔' + j + ': ';
while (str.length < 8) str = ' ' + str;
for (k = 0; k < a.length; k++) {
if (k > 0) str += ',';
if (k === i || k === j) str += '[';
str += a[k];
if (k === i || k === j) str += ']';
}
console.log(str);
}
}
let s = [503,087,512,061,908,170,897,275,653,426,154,509,612,677,765,703];
quickSort(s);
Steps
503,87,512,49,908,170,897,275,653,426,154,509,612,677,765,703
275,87,154,49,426,170,503,897,653,908,512,509,612,677,765,703
170,87,154,49,275,426,503,897,653,908,512,509,612,677,765,703
49,87,154,170,275,426,503,897,653,908,512,509,612,677,765,703
49,87,154,170,275,426,503,897,653,908,512,509,612,677,765,703
49,87,154,170,275,426,503,897,653,908,512,509,612,677,765,703
49,87,154,170,275,426,503,765,653,703,512,509,612,677,897,908
49,87,154,170,275,426,503,677,653,703,512,509,612,765,897,908
49,87,154,170,275,426,503,509,653,612,512,677,703,765,897,908
49,87,154,170,275,426,503,509,653,612,512,677,703,765,897,908
49,87,154,170,275,426,503,509,512,612,653,677,703,765,897,908
49,87,154,170,275,426,503,509,512,612,653,677,703,765,897,908
Steps and Swaps
Step 1: [503,87,512,49,908,170,897,275,653,426,154,509,612,677,765,703]
2⇔10: 503,87,[512],49,908,170,897,275,653,426,[154],509,612,677,765,703
4⇔9: 503,87,154,49,[908],170,897,275,653,[426],512,509,612,677,765,703
6⇔7: 503,87,154,49,426,170,[897],[275],653,908,512,509,612,677,765,703
0⇔6: [503],87,154,49,426,170,[275],897,653,908,512,509,612,677,765,703
Step 2: [275,87,154,49,426,170],|503|,897,653,908,512,509,612,677,765,703
4⇔5: 275,87,154,49,[426],[170],503,897,653,908,512,509,612,677,765,703
0⇔4: [275],87,154,49,[170],426,503,897,653,908,512,509,612,677,765,703
Step 3: [170,87,154,49],|275|,426,503,897,653,908,512,509,612,677,765,703
0⇔3: [170],87,154,[49],275,426,503,897,653,908,512,509,612,677,765,703
Step 4: [49,87,154],|170|,275,426,503,897,653,908,512,509,612,677,765,703
Step 5: |49|,[87,154],170,275,426,503,897,653,908,512,509,612,677,765,703
Step 6: 49,|87|,154,170,275,426,503,[897,653,908,512,509,612,677,765,703]
9⇔15: 49,87,154,170,275,426,503,897,653,[908],512,509,612,677,765,[703]
7⇔14: 49,87,154,170,275,426,503,[897],653,703,512,509,612,677,[765],908
Step 7: 49,87,154,170,275,426,503,[765,653,703,512,509,612,677],|897|,908
7⇔13: 49,87,154,170,275,426,503,[765],653,703,512,509,612,[677],897,908
Step 8: 49,87,154,170,275,426,503,[677,653,703,512,509,612],|765|,897,908
9⇔12: 49,87,154,170,275,426,503,677,653,[703],512,509,[612],765,897,908
7⇔11: 49,87,154,170,275,426,503,[677],653,612,512,[509],703,765,897,908
Step 9: 49,87,154,170,275,426,503,[509,653,612,512],|677|,703,765,897,908
Step 10: 49,87,154,170,275,426,503,|509|,[653,612,512],677,703,765,897,908
8⇔10: 49,87,154,170,275,426,503,509,[653],612,[512],677,703,765,897,908
Step 11: 49,87,154,170,275,426,503,509,[512,612],|653|,677,703,765,897,908
Step 12: 49,87,154,170,275,426,503,509,|512|,612,653,677,703,765,897,908