Skip to content

Commit 88433e8

Browse files
committed
added sorts
1 parent c89f594 commit 88433e8

11 files changed

+191
-3
lines changed

src/main.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
import { searchDBG } from "./array/search-in-rotated-sorted-array";
22
import { flatDBG } from "./js_core/flatten";
33
import { findAnagramsDBG } from "./string/find-anagrams";
4+
import { isOneEditDistanceDBG } from "./string/is-one-edit-distance";
45
import { lengthOfLongestSubstringDBG } from "./string/longest-substring.string";
56
import { testValidPalindrome } from "./string/valid-palindrome";
67
import { EventEmitter } from 'node:events';
8+
import './sort';
79

810

9-
isOneEditDistanceDBG();
11+
const t = [3,1,2].insertionSort();
12+
13+
console.log(t)
14+
15+
//isOneEditDistanceDBG();

src/sort/bubble.sort.ts

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { defaultComparator } from "./utilities";
2+
3+
Array.prototype.bubbleSort = function<T>(
4+
compareFn: (a: T, b: T) => number = defaultComparator
5+
): T[] {
6+
const arr = this as T[];
7+
const len = arr.length;
8+
9+
for (let i = 0; i < len; i++) {
10+
for (let j = 0; j < len - 1 - i; j++) {
11+
if (compareFn(arr[j], arr[j + 1]) > 0) {
12+
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
13+
}
14+
}
15+
}
16+
return arr;
17+
}

src/sort/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './bubble.sort';
2+
export * from './selection.sort';

src/sort/insertion.sort.ts

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { defaultComparator } from "./utilities";
2+
3+
Array.prototype.insertionSort = function<T>(
4+
compareFn: (a: T, b: T) => number = defaultComparator
5+
): T[] {
6+
const arr = this as T[];
7+
const len = arr.length;
8+
9+
for (let i = 1; i < len; i++) {
10+
let current = arr[i];
11+
let j = i - 1;
12+
while (j >= 0 && compareFn(arr[j], current) > 0) {
13+
arr[j + 1] = arr[j];
14+
j--;
15+
}
16+
arr[j + 1] = current;
17+
}
18+
19+
return arr;
20+
};

src/sort/merge.sort.ts

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { defaultComparator } from "./utilities";
2+
3+
Array.prototype.mergeSort = function<T>(
4+
compareFn: (a: T, b: T) => number = defaultComparator
5+
): T[] {
6+
const arr = this as T[];
7+
8+
const merge = (left: T[], right: T[]): T[] => {
9+
const result: T[] = [];
10+
let i = 0;
11+
let j = 0;
12+
13+
while (i < left.length && j < right.length) {
14+
if (compareFn(left[i], right[j]) <= 0) {
15+
result.push(left[i]);
16+
i++;
17+
} else {
18+
result.push(right[j]);
19+
j++;
20+
}
21+
}
22+
23+
return result.concat(left.slice(i)).concat(right.slice(j));
24+
};
25+
26+
if (arr.length <= 1) {
27+
return arr;
28+
}
29+
30+
const mid = Math.floor(arr.length / 2);
31+
const left = arr.slice(0, mid).mergeSort(compareFn);
32+
const right = arr.slice(mid).mergeSort(compareFn);
33+
34+
return merge(left, right);
35+
};

src/sort/quick.sort.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { defaultComparator } from "./utilities";
2+
3+
Array.prototype.quickSort = function<T>(
4+
compareFn: (a: T, b: T) => number = defaultComparator
5+
): T[] {
6+
const arr = this as T[];
7+
8+
if (arr.length <= 1) {
9+
return arr;
10+
}
11+
12+
const pivot = arr[Math.floor(arr.length / 2)];
13+
const left = arr.filter((x) => compareFn(x, pivot) < 0);
14+
const right = arr.filter((x) => compareFn(x, pivot) > 0);
15+
const middle = arr.filter((x) => compareFn(x, pivot) === 0);
16+
17+
return left.quickSort(compareFn).concat(middle, right.quickSort(compareFn));
18+
};

src/sort/selection.sort.ts

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { defaultComparator } from "./utilities";
2+
3+
Array.prototype.selectionSort = function<T>(
4+
compareFn: (a: T, b: T) => number = defaultComparator
5+
): T[] {
6+
const arr = this as T[];
7+
const len = arr.length;
8+
9+
for (let i = 0; i < len; i++) {
10+
let minIndex = i;
11+
for (let j = i + 1; j < len; j++) {
12+
if (compareFn(arr[j], arr[minIndex]) < 0) {
13+
minIndex = j;
14+
}
15+
}
16+
if (minIndex !== i) {
17+
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
18+
}
19+
}
20+
21+
return arr;
22+
}

src/sort/sort.d.ts

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
export declare global {
2+
interface Array<T> {
3+
/**
4+
* @default runtime: O(n^2) memory: O(1)
5+
*/
6+
bubbleSort(compareFn?: (a: T, b: T) => number): this;
7+
/**
8+
* @default runtime: O(n^2) memory: O(1)
9+
*/
10+
selectionSort(compareFn?: (a: T, b: T) => number): this;
11+
/**
12+
* @default runtime: O(n^2) memory: O(1)
13+
*/
14+
insertionSort(compareFn?: (a: T, b: T) => number): this;
15+
/**
16+
* @default runtime: O(n log n) memory: O(n)
17+
*/
18+
mergeSort(compareFn?: (a: T, b: T) => number): this;
19+
/**
20+
* @default
21+
* runtime: O(n log n) (average case), O(n^2) (worst case)
22+
* memory: O(log n) (for recursion stack)
23+
*/
24+
quickSort(compareFn?: (a: T, b: T) => number): this;
25+
/**
26+
* @default runtime: O(n log n) memory: O(1)
27+
*/
28+
heapSort(compareFn?: (a: T, b: T) => number): this;
29+
/**
30+
* @default runtime: O(n * k) memory: O(n)
31+
*/
32+
radixSort(compareFn?: (a: T, b: T) => number): this;
33+
/**
34+
* @default runtime: O(n * k) memory: O(n)
35+
*/
36+
countingSort(compareFn?: (a: T, b: T) => number): this;
37+
/**
38+
* @default runtime: O(n + k) memory: O(n + k)
39+
*/
40+
bucketSort(compareFn?: (a: T, b: T) => number): this;
41+
/**
42+
* @default
43+
* runtime: O(n log n) (average case), O(n^2) (worst case)
44+
* memory: O(1) (for recursion stack)
45+
*/
46+
shellSort(compareFn?: (a: T, b: T) => number): this;
47+
/**
48+
* @default runtime: O(n ^ 2) memory: O(1)
49+
*/
50+
cocktailSort(compareFn?: (a: T, b: T) => number): this;
51+
/**
52+
* @default runtime: O(n ^ 2) memory: O(1)
53+
*/
54+
combSort(compareFn?: (a: T, b: T) => number): this;
55+
}
56+
}
57+

src/sort/utilities.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const defaultComparator = <T>(a: T, b: T) => (a > b ? 1 : a < b ? -1 : 0);

src/string/is-one-edit-distance.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@ function isOneEditDistance(s: string, t: string): boolean {
1717
}
1818
}
1919
}
20-
return lenS + 1 === lenT;
20+
return true;
2121
}
2222

2323
export const isOneEditDistanceDBG = () => {
2424
const tests = [
25+
{
26+
input: { s: "120031", t: "120032" },
27+
result: true
28+
},
2529
{
2630
input: { s: "ab", t: "acb" },
2731
result: true
@@ -33,7 +37,8 @@ export const isOneEditDistanceDBG = () => {
3337
{
3438
input: { s: "1203", t: "1213" },
3539
result: true
36-
}
40+
},
41+
3742
];
3843

3944
tests.forEach((test, index) => {

tsconfig.build.json

+5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
{
2+
"compilerOptions": {
3+
"paths": {
4+
"@sorts": ["src/sort/index"]
5+
}
6+
},
27
"extends": "./tsconfig.json",
38
"exclude": ["node_modules", "dist" ]
49
}

0 commit comments

Comments
 (0)