Skip to content

Commit a52b849

Browse files
author
Oskar Widmark
committed
feat: average sort
1 parent cf4b20e commit a52b849

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed

src/App.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ class App extends React.Component<Props> {
9595
this.sortingAlgorithms = new SortingAlgorithms(
9696
this.state.settings.columnNbr,
9797
this.compare,
98+
this.valueCompare,
9899
this.drawAndSwap,
99100
);
100101

@@ -270,6 +271,43 @@ class App extends React.Component<Props> {
270271
}
271272
};
272273

274+
valueCompare = async (
275+
arr: SortValue[],
276+
i: number,
277+
operator: Operator,
278+
value: number,
279+
): Promise<boolean> => {
280+
if (!this.state.isSorting) throw Error('isSorting is false!');
281+
this.nbrOfComparisons++;
282+
if (this.state.settings.compareTime) {
283+
// With a zero compareTime, maximum update depth will be exceeded
284+
// when updating state too often
285+
this.setState((prevState: typeof this.state) => ({
286+
nbrOfComparisons: prevState.nbrOfComparisons + 1,
287+
}));
288+
this.canvasController.highlightColumns(arr, [i]);
289+
await sleep(this.state.settings.compareTime);
290+
}
291+
292+
if (
293+
sortNameToSortType[this.state.settings.chosenSortAlg] ===
294+
SortType.Comparison
295+
) {
296+
this.playSoundForColumn(arr, i);
297+
}
298+
299+
switch (operator) {
300+
case '<':
301+
return arr[i].value < value;
302+
case '>':
303+
return arr[i].value > value;
304+
case '<=':
305+
return arr[i].value <= value;
306+
case '>=':
307+
return arr[i].value >= value;
308+
}
309+
};
310+
273311
public async swap(arr: SortValue[], i1: number, i2: number) {
274312
if (!this.state.isSorting) throw Error('isSorting is false!');
275313

src/sorting-algorithms.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export class SortingAlgorithms {
2121
[SortName.ShellSort]: this.shellSort,
2222
[SortName.BitonicSort]: this.bitonicSort,
2323
[SortName.BullySort]: this.bullySort,
24+
[SortName.AverageSort]: this.averageSort,
2425
// 'Bully Sort 2': this.bullySort2,
2526
};
2627

@@ -32,6 +33,12 @@ export class SortingAlgorithms {
3233
operator: Operator,
3334
j: number,
3435
) => Promise<boolean>,
36+
private valueCompare: (
37+
arr: SortValue[],
38+
i: number,
39+
operator: Operator,
40+
value: number,
41+
) => Promise<boolean>,
3542
private drawAndSwap: (
3643
arr: SortValue[],
3744
i: number,
@@ -533,4 +540,36 @@ public async mergeSort(arr, start, end){
533540
}
534541
}
535542
}
543+
544+
public async averageSort(arr: SortValue[]) {
545+
await this._averageSort(arr, 0, this._columnNbr);
546+
}
547+
548+
public async _averageSort(arr: SortValue[], start: number, end: number) {
549+
if (end - start <= 1) return;
550+
551+
let sum = 0;
552+
for (let i = start; i < end; i++) {
553+
// for highlighting and counting comparison
554+
// TODO: replace
555+
await this.valueCompare(arr, i, '>', 0);
556+
sum += arr[i].value;
557+
}
558+
const avg = sum / (end - start);
559+
const mid = Math.floor((start + end) / 2);
560+
561+
let j = start;
562+
for (let i = mid; i < end; i++) {
563+
while (await this.valueCompare(arr, j, '<', avg)) {
564+
j++;
565+
}
566+
if (await this.valueCompare(arr, i, '<', avg)) {
567+
await this.drawAndSwap(arr, i, j);
568+
j++;
569+
}
570+
}
571+
572+
await this._averageSort(arr, start, mid);
573+
await this._averageSort(arr, mid, end);
574+
}
536575
}

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export enum SortName {
1212
ShellSort = 'Shell Sort',
1313
BitonicSort = 'Bitonic Sort',
1414
BullySort = 'Bully Sort',
15+
AverageSort = 'Average Sort',
1516
}
1617

1718
export type SortAlgorithm = (

src/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export const sortNameToSortType: Record<SortName, string> = {
5858
[SortName.ShellSort]: SortType.Comparison,
5959
[SortName.BitonicSort]: SortType.Comparison,
6060
[SortName.BullySort]: SortType.Comparison,
61+
[SortName.AverageSort]: SortType.Comparison,
6162
};
6263

6364
// something that sounds good

0 commit comments

Comments
 (0)