sort-n-search 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # sort-n-search
2
+
3
+ Библиотека алгоритмов сортировки и поиска на Node.js.
4
+
5
+ ## Установка
6
+
7
+ ```bash
8
+ npm install sort-n-search
9
+ ```
10
+
11
+ ## Использование
12
+
13
+ ```javascript
14
+ import {
15
+ bubbleSort,
16
+ quickSort,
17
+ mergeSort,
18
+ linearSearch,
19
+ binarySearch
20
+ } from 'sort-n-search';
21
+
22
+ ## Алгоритмы
23
+
24
+ ### Сортировка
25
+
26
+ | Алгоритм | Время (среднее) | Время (худшее) | Место |
27
+ |----------|---------------|---------------|-------|
28
+ | bubbleSort | O(n²) | O(n²) | O(1) |
29
+ | quickSort | O(n log n) | O(n²) | O(log n) |
30
+ | mergeSort | O(n log n) | O(n log n) | O(n) |
31
+
32
+ ### Поиск
33
+
34
+ | Алгоритм | Время | Место | Требования |
35
+ |----------|-------|-------|------------|
36
+ | linearSearch | O(n) | O(1) | Nenhum |
37
+ | binarySearch | O(log n) | O(1) | Отсортированный массив |
38
+
39
+ ## Тестирование
40
+
41
+ ```bash
42
+ npm test
43
+ ```
44
+
45
+ ## Лицензия
46
+
47
+ MIT
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ presets: [
3
+ ['@babel/preset-env', {
4
+ targets: {
5
+ node: 'current'
6
+ }
7
+ }]
8
+ ]
9
+ };
package/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // Групповые экспорты
2
+ export * from './src/sorting/index.js';
3
+ export * from './src/search/index.js';
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "sort-n-search",
3
+ "version": "1.0.0",
4
+ "description": "Библиотека алгоритмов сортировки и поиска на Node.js",
5
+ "license": "ISC",
6
+ "author": "Матвей Оспищев",
7
+ "type": "module",
8
+ "main": "index.js",
9
+ "public": true,
10
+ "scripts": {
11
+ "test": "jest"
12
+ },
13
+ "jest": {
14
+ "testEnvironment": "node",
15
+ "transform": {
16
+ "^.+\\.(js|jsx)$": "babel-jest"
17
+ }
18
+ },
19
+ "devDependencies": {
20
+ "@babel/preset-env": "^7.29.7",
21
+ "babel-jest": "^30.4.1",
22
+ "jest": "^30.4.2"
23
+ }
24
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Бинарный поиск (для отсортированных массивов)
3
+ * @param {number[]} array - отсортированный массив
4
+ * @param {number} target - целевое значение
5
+ * @returns {number} - индекс элемента или -1 если не найдено
6
+ * @time O(log n)
7
+ * @space O(1)
8
+ */
9
+ export function binarySearch(array, target) {
10
+ if (!Array.isArray(array)) {
11
+ throw new Error('Input must be an array');
12
+ }
13
+
14
+ let left = 0;
15
+ let right = array.length - 1;
16
+
17
+ while (left <= right) {
18
+ const mid = Math.floor((left + right) / 2);
19
+
20
+ if (array[mid] === target) {
21
+ return mid;
22
+ } else if (array[mid] < target) {
23
+ left = mid + 1;
24
+ } else {
25
+ right = mid - 1;
26
+ }
27
+ }
28
+
29
+ return -1;
30
+ }
@@ -0,0 +1,2 @@
1
+ export { linearSearch } from './linearSearch.js';
2
+ export { binarySearch } from './binarySearch.js';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Линейный поиск
3
+ * @param {number[]} array - массив для поиска
4
+ * @param {number} target - целевое значение
5
+ * @returns {number} - индекс элемента или -1 если не найдено
6
+ * @time O(n)
7
+ * @space O(1)
8
+ */
9
+ export function linearSearch(array, target) {
10
+ if (!Array.isArray(array)) {
11
+ throw new Error('Input must be an array');
12
+ }
13
+
14
+ for (let i = 0; i < array.length; i++) {
15
+ if (array[i] === target) {
16
+ return i;
17
+ }
18
+ }
19
+
20
+ return -1;
21
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Сортировка пузырьком
3
+ * @param {number[]} array - массив для сортировки
4
+ * @returns {number[]} - отсортированный массив
5
+ * @time O(n²)
6
+ * @space O(1)
7
+ */
8
+ export function bubbleSort(array) {
9
+ if (!Array.isArray(array)) {
10
+ throw new Error('Input must be an array');
11
+ }
12
+
13
+ const result = [...array];
14
+ const n = result.length;
15
+
16
+ for (let i = 0; i < n - 1; i++) {
17
+ for (let j = 0; j < n - i - 1; j++) {
18
+ if (result[j] > result[j + 1]) {
19
+ [result[j], result[j + 1]] = [result[j + 1], result[j]];
20
+ }
21
+ }
22
+ }
23
+
24
+ return result;
25
+ }
@@ -0,0 +1,3 @@
1
+ export { bubbleSort } from './bubbleSort.js';
2
+ export { quickSort } from './quickSort.js';
3
+ export { mergeSort } from './mergeSort.js';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Сортировка слиянием
3
+ * @param {number[]} array - массив для сортировки
4
+ * @returns {number[]} - отсортированный массив
5
+ * @time O(n log n)
6
+ * @space O(n)
7
+ */
8
+ export function mergeSort(array) {
9
+ if (!Array.isArray(array)) {
10
+ throw new Error('Input must be an array');
11
+ }
12
+
13
+ if (array.length <= 1) return array;
14
+
15
+ const mid = Math.floor(array.length / 2);
16
+ const left = mergeSort(array.slice(0, mid));
17
+ const right = mergeSort(array.slice(mid));
18
+
19
+ return merge(left, right);
20
+ }
21
+
22
+ function merge(left, right) {
23
+ const result = [];
24
+ let i = 0, j = 0;
25
+
26
+ while (i < left.length && j < right.length) {
27
+ if (left[i] <= right[j]) {
28
+ result.push(left[i]);
29
+ i++;
30
+ } else {
31
+ result.push(right[j]);
32
+ j++;
33
+ }
34
+ }
35
+
36
+ return [...result, ...left.slice(i), ...right.slice(j)];
37
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Быстрая сортировка
3
+ * @param {number[]} array - массив для сортировки
4
+ * @returns {number[]} - отсортированный массив
5
+ * @time O(n log n) в среднем, O(n²) в худшем
6
+ * @space O(log n)
7
+ */
8
+ export function quickSort(array) {
9
+ if (!Array.isArray(array)) {
10
+ throw new Error('Input must be an array');
11
+ }
12
+
13
+ if (array.length <= 1) return array;
14
+
15
+ const pivot = array[Math.floor(array.length / 2)];
16
+ const left = array.filter(x => x < pivot);
17
+ const middle = array.filter(x => x === pivot);
18
+ const right = array.filter(x => x > pivot);
19
+
20
+ return [...quickSort(left), ...middle, ...quickSort(right)];
21
+ }
@@ -0,0 +1,17 @@
1
+ import { binarySearch } from '../../searching/binarySearch';
2
+
3
+ describe('binarySearch', () => {
4
+ test('находит элемент в отсортированном массиве', () => {
5
+ const array = [1, 3, 5, 7, 9, 11];
6
+ expect(binarySearch(array, 7)).toBe(3);
7
+ });
8
+
9
+ test('возвращает -1 если элемент не найден', () => {
10
+ const array = [1, 3, 5, 7, 9];
11
+ expect(binarySearch(array, 6)).toBe(-1);
12
+ });
13
+
14
+ test('обрабатывает пустой массив', () => {
15
+ expect(binarySearch([], 5)).toBe(-1);
16
+ });
17
+ });
@@ -0,0 +1,17 @@
1
+ import { linearSearch } from '../../searching/linearSearch';
2
+
3
+ describe('linearSearch', () => {
4
+ test('находит элемент в отсортированном массиве', () => {
5
+ const array = [1, 3, 5, 7, 9, 11];
6
+ expect(linearSearch(array, 7)).toBe(3);
7
+ });
8
+
9
+ test('возвращает -1 если элемент не найден', () => {
10
+ const array = [1, 3, 5, 7, 9];
11
+ expect(linearSearch(array, 6)).toBe(-1);
12
+ });
13
+
14
+ test('обрабатывает пустой массив', () => {
15
+ expect(linearSearch([], 5)).toBe(-1);
16
+ });
17
+ });
@@ -0,0 +1,21 @@
1
+ import { bubbleSort } from '../../sorting/bubbleSort';
2
+
3
+ describe('bubbleSort', () => {
4
+ test('сортирует массив чисел правильно', () => {
5
+ const input = [5, 2, 8, 1, 9];
6
+ const expected = [1, 2, 5, 8, 9];
7
+ expect(bubbleSort(input)).toEqual(expected);
8
+ });
9
+
10
+ test('возвращает пустой массив для пустого входного', () => {
11
+ expect(bubbleSort([])).toEqual([]);
12
+ });
13
+
14
+ test('обрабатывает массив с одним элементом', () => {
15
+ expect(bubbleSort([42])).toEqual([42]);
16
+ });
17
+
18
+ test('вызывает ошибку для не-массива', () => {
19
+ expect(() => bubbleSort('not array')).toThrow('Input must be an array');
20
+ });
21
+ });
@@ -0,0 +1,21 @@
1
+ import { mergeSort } from '../../sorting/mergeSort';
2
+
3
+ describe('mergeSort', () => {
4
+ test('сортирует массив чисел правильно', () => {
5
+ const input = [5, 2, 8, 1, 9];
6
+ const expected = [1, 2, 5, 8, 9];
7
+ expect(mergeSort(input)).toEqual(expected);
8
+ });
9
+
10
+ test('возвращает пустой массив для пустого входного', () => {
11
+ expect(mergeSort([])).toEqual([]);
12
+ });
13
+
14
+ test('обрабатывает массив с одним элементом', () => {
15
+ expect(mergeSort([42])).toEqual([42]);
16
+ });
17
+
18
+ test('вызывает ошибку для не-массива', () => {
19
+ expect(() => mergeSort('not array')).toThrow('Input must be an array');
20
+ });
21
+ });
@@ -0,0 +1,21 @@
1
+ import { quickSort } from '../../sorting/quickSort';
2
+
3
+ describe('quickSort', () => {
4
+ test('сортирует массив чисел правильно', () => {
5
+ const input = [5, 2, 8, 1, 9];
6
+ const expected = [1, 2, 5, 8, 9];
7
+ expect(quickSort(input)).toEqual(expected);
8
+ });
9
+
10
+ test('возвращает пустой массив для пустого входного', () => {
11
+ expect(quickSort([])).toEqual([]);
12
+ });
13
+
14
+ test('обрабатывает массив с одним элементом', () => {
15
+ expect(quickSort([42])).toEqual([42]);
16
+ });
17
+
18
+ test('вызывает ошибку для не-массива', () => {
19
+ expect(() => quickSort('not array')).toThrow('Input must be an array');
20
+ });
21
+ });