-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsort.js
More file actions
executable file
·106 lines (96 loc) · 2.43 KB
/
sort.js
File metadata and controls
executable file
·106 lines (96 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#! /usr/bin/env node
const fs = require("fs");
const readline = require("readline");
const {
radixSort,
mergeSort,
quickSort,
heapSort,
randomSort,
removeDuplicatesFromSortedArray,
removeDuplicatesFromUnSortedArray,
} = require("./utils");
const heapInsert = async (file) => {
if (!fs.existsSync(file)) stream = process.stdin;
else {
stream = fs.createReadStream(file);
}
return new Promise((resolve) => {
const rl = readline.createInterface({
input: stream,
output: undefined,
terminal: false,
});
const res = [];
rl.on("line", function (line) {
if (line.trim()) heapSort.insert(res, line.trim());
});
rl.on("close", function () {
resolve(res);
});
});
};
async function main() {
const args = process.argv;
let file;
let unique = false;
let option;
file = args[args.length - 1];
const validSortOptions = new Set([
"--radix-sort",
"--quick-sort",
"--heap-sort",
"--merge-sort",
"--random-sort",
]);
for (let i = args.length - 2; i >= 2; i--) {
if (args[i] === "-u") unique = true;
if (validSortOptions.has(args[i])) option = args[i];
}
const fileContent =
option === "--heap-sort"
? await heapInsert(file)
: fs
.readFileSync(file, "utf-8")
.trim()
.split(/\n|\r|\r\n/);
const logResult = async (sortedArray, unique, randomSort) => {
if (unique) {
removeDuplicatesFromSortedArray(sortedArray);
if (randomSort) {
sortedArray = removeDuplicatesFromUnSortedArray(sortedArray);
}
}
console.log(sortedArray.join("\n"));
};
switch (option) {
case "--radix-sort": {
logResult(radixSort(fileContent), unique);
break;
}
// removes duplicates whilst sort
case "--quick-sort": {
logResult(quickSort(fileContent, unique));
break;
}
case "--heap-sort": {
logResult(heapSort.heapSort(fileContent, true), unique);
break;
}
// removes duplicates whilst sort
case "--merge-sort": {
logResult(mergeSort(fileContent, unique));
break;
}
// removes duplicates whilst sort
case "--random-sort": {
logResult(randomSort(fileContent), unique, true);
break;
}
default: // tim sort: combination of insertion sort and merge sort
logResult(fileContent.sort(), unique);
}
}
main()
.then()
.catch((e) => console.error("No such file or invalid option"));