Skip to content

Commit

Permalink
Merge pull request #1 from kwooshung/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
kwooshung authored Jan 12, 2024
2 parents 7367696 + 4e1e596 commit 0415341
Show file tree
Hide file tree
Showing 73 changed files with 9,425 additions and 0 deletions.
7 changes: 7 additions & 0 deletions .codeclimate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version: "2"
exclude_patterns:
- "scripts/"
- "**/*test.js"
- "**/*test.ts"
- "**/*spec.js"
- "**/*spec.ts"
1 change: 1 addition & 0 deletions .commitlintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('./configs/commitlintrc.cjs');
1 change: 1 addition & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('./configs/eslintrc.cjs');
65 changes: 65 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: ci

# 当推送到 main分支 时 触发此工作流
on:
push:
branches:
- main
permissions:
contents: write

jobs:
build-and-deploy:
runs-on: ubuntu-latest

steps:
- name: checkout
uses: actions/checkout@main

# 全局安装 pnpm
- name: install pnpm
run: npm install -g pnpm

# 使用 pnpm 安装依赖
- name: install dependencies
run: pnpm install

# 使用 pnpm 执行测试
- name: run tests
run: pnpm test:ci

# 上传覆盖率报告到 Coveralls
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@main
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

# 使用 pnpm 构建
- name: build
run: pnpm build

# 自动发布
- name: Auto Release
run: npx cvlar -r
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# 同步到 Gitee
- name: Sync to Gitee
uses: wearerequired/git-mirror-action@master
env:
SSH_PRIVATE_KEY: ${{ secrets.GITEE_PRIVATE_KEY }}
with:
source-repo: '[email protected]:kwooshung/algorithm-sorts.git'
destination-repo: '[email protected]:kwooshung/algorithm-sorts.git'

# 自动发布到 npm
- name: Sync to Npm.js
uses: actions/setup-node@main
with:
node-version: '14.0.0'
registry-url: https://registry.npmjs.org/
- name: Publish to Npm.js
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
.eslintcache
.stylelintcache
node_modules
dist
dist-ssr
coverage
*.local
# Editor directories and files
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.cvlar-commit-message-*.tmp
3 changes: 3 additions & 0 deletions .husky/commit-msg
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx --no-install commitlint --edit $1
3 changes: 3 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
1 change: 1 addition & 0 deletions .ks-cvlarrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('./configs/.ks-cvlarrc.cjs');
4 changes: 4 additions & 0 deletions .lintstagedrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"*.{js,jsx,ts,tsx}": ["npx prettier --write", "npx eslint --fix"],
"*.json": ["npx prettier --write"]
}
41 changes: 41 additions & 0 deletions .prettierrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
module.exports = {
eslintInter: true,
// 一行最多 200 字符
printWidth: 200,
// 使用 2 个空格缩进
tabWidth: 2,
// 不使用缩进符,而使用空格
useTabs: false,
// 行尾分号
semi: true,
// 使用单引号
singleQuote: true,
// 对象的 key 仅在必要时用引号
quoteProps: 'as-needed',
// jsx 使用单引号
jsxSingleQuote: true,
// 尾随逗号
trailingComma: 'all',
// 大括号内的首尾需要空格
bracketSpacing: true,
// jsx 标签的反尖括号需要换行
jsxBracketSameLine: true,
// 箭头函数,只有一个参数的时候,也需要括号
arrowParens: 'always',
// 每个文件格式化的范围是文件的全部内容
rangeStart: 0,
// 需要格式化和检查的代码结束偏移值(从尾部开始)
rangeEnd: Infinity,
// 不需要写文件开头的 @prettier
requirePragma: false,
// 不需要自动在文件开头插入 @prettier
insertPragma: false,
// 使用默认的折行标准
proseWrap: 'preserve',
// 根据显示样式决定 html 要不要折行
htmlWhitespaceSensitivity: 'css',
// 去除对象最后一个逗号
trailingComma: 'none',
// 换行符使用 lf
endOfLine: 'lf'
};
132 changes: 132 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
<div align="center">

# @kwooshung/algorithm-sorts

![GitHub Release Date - Published_At](https://img.shields.io/github/release-date/kwooshung/algorithm-sorts?labelColor=272e3b&color=00b42A&logo=github)
![GitHub last commit](https://img.shields.io/github/last-commit/kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)
![GitHub top language](https://img.shields.io/github/languages/top/kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)
![GitHub pull requests](https://img.shields.io/github/issues-pr/kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)
![GitHub issues](https://img.shields.io/github/issues/kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)
[![NPM Version](https://img.shields.io/npm/v/@kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)](https://www.npmjs.com/package/@kwooshung/algorithm-sorts)
[![Npm.js Downloads/Week](https://img.shields.io/npm/dw/@kwooshung/algorithm-sorts?labelColor=272e3b&labelColor=272e3b&color=165dff&logo=npm)](https://www.npmjs.com/package/@kwooshung/algorithm-sorts)
[![Github CI/CD](https://github.com/kwooshung/algorithm-sorts/actions/workflows/ci.yml/badge.svg)](https://github.com/kwooshung/algorithm-sorts/actions/)
[![codecov](https://codecov.io/gh/kwooshung/algorithm-sorts/graph/badge.svg?token=VVZJE7H0KD)](https://codecov.io/gh/kwooshung/algorithm-sorts)
[![Maintainability](https://api.codeclimate.com/v1/badges/325d0881b1ca19165d35/maintainability)](https://codeclimate.com/github/kwooshung/algorithm-sorts/maintainability/)
[![GitHub License](https://img.shields.io/github/license/kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)](LICENSE)
[![Gitee Repo](https://img.shields.io/badge/gitee-cvlar-165dff?logo=gitee)](https://gitee.com/kwooshung/algorithm-sorts/)
![Github Stars](https://img.shields.io/github/stars/kwooshung/algorithm-sorts?labelColor=272e3b&color=165dff)

<p align="center">
<a href="README.zh-CN.md">中文</a> |
<a href="README.md" style="font-weight:700;color:#165dff;text-decoration:underline;">English</a>
</p>
</div>

# Why was it developed?

- During development, I needed to use algorithms and found the [algorithms.js](https://github.com/felipernb/algorithms.js) library. Its implementation is excellent. This project is based on [algorithms.js](https://github.com/felipernb/algorithms.js), with slight modifications in the [compare](src/internal/compare/index.ts) section.
- [algorithms.js](https://github.com/felipernb/algorithms.js) is implemented using the `commonjs` standard, not `esm`. This means it can't utilize `tree shaking`. While there are indirect methods to achieve this, they are not as convenient as using the `esm` standard directly.
- [algorithms.js](https://github.com/felipernb/algorithms.js) hasn't been maintained for several years. Some algorithms and implementation logic would be better with a modern approach.

# Why Use It?

- Written in `Typescript` with unit testing, ensuring code quality with `100%` coverage.
- Supports both `esm` and `commonjs` standards. The `esm` standard enables direct use of `tree shaking` to reduce the bundle size.
- Clear documentation, including comments in both Chinese and English, making it easy to read and understand, as shown below.

```ts
/**
* 短冒泡排序 / Short Bubble Sort
* @description 短冒泡排序是冒泡排序的一种变体,当在整个排序过程中没有进行任何交换时,该算法会提前停止 / Short bubble sort is a variation of bubble sort that stops early if no swaps are made during the entire sorting process
* @usageScenario 适用于检测几乎已经排序好的数组 / Suitable for detecting nearly sorted arrays
* @timeComplexity 最好情况 O(n),平均和最坏情况 O(n^2) / Best case O(n), average and worst case O(n^2)
* @param {T[]} array 待排序数组 / Array to be sorted
* @param {boolean} [modifyOriginal=true] 是否修改原数组 / Whether to modify the original array
* @param {(a: T, b: T) => number} [compareFunction] 比较函数,定义元素的排序方式 / Comparison function, defines the sorting order of elements
* @param {boolean} [reverse=false] 是否反转结果 / Whether to reverse the result
*/
```

- Compared to [algorithms.js](https://github.com/felipernb/algorithms.js), our sorting algorithms include several additional ones, with more to be added in the future.
- In most cases, the efficiency of our library's algorithms is superior to [algorithms.js](https://github.com/felipernb/algorithms.js). There are comparative charts below, and you can also `git clone` this project and run `npm compare` for testing.

# When Not to Use It?

As the project name suggests, our project's algorithms only support `sorting`. If you need other types of algorithms, you might want to use [algorithms.js](https://github.com/felipernb/algorithms.js).

# Efficiency Comparison

The comparison involves random data of 1000 items, with string lengths varying from 6 to 32 and numbers ranging from 0 to 1,000,000, as shown below:

| Algorithm | algorithms.js | @kwooshung/algorithm-sorts | Difference |
| :---------------------- | :-----------: | :------------------------: | :------------: |
| Bubble Sort | 65.0368 ms | 65.0298 ms | -0.0070 ms |
| Shout Bubble Sort | 13251.3260 ms | 128.2500 ms | -13123.0760 ms |
| Cocktail Sort | - | 52.7166 ms | - |
| Counting Sort | - | 12.3503 ms | - |
| Optimized Counting Sort | 33.2357 ms | 32.6380 ms | -0.5977 ms |
| Heap Sort | 8.3025 ms | 4.6525 ms | -3.6500 ms |
| Insertion Sort | 27.4480 ms | 27.4331 ms | -0.0149 ms |
| Merge Sort | 2.9167 ms | 2.5592 ms | -0.3575 ms |
| Pancake Sort | - | 57.7009 ms | 0 ms |
| Quick Sort | 3.0599 ms | 2.6374 ms | -0.4225 ms |
| Radix Sort | 0.2070 ms | 0.1339 ms | -0.0731 ms |
| Selection Sort | 55.8389 ms | 55.8000 ms | -0.0389 ms |
| Shell Sort | 3.1775 ms | 3.1564 ms | -0.0211 ms |
| Tim Sort | - | 6.7950 ms | - |

# Install

## npm

```bash
npm install @kwooshung/algorithm-sorts --save-dev
```

## yarn

```bash
yarn add @kwooshung/algorithm-sorts -D
```

## pnpm

```bash
pnpm add @kwooshung/algorithm-sorts -D
```

# Usage

## Importing

### esm

```ts
import { bubbleSort } from '@kwooshung/algorithm-sorts';
```

### commonjs

```ts
const { bubbleSort } = require('@kwooshung/algorithm-sorts');
```

## Supported Algorithms

> Currently, the following sorting algorithms are supported. For specific usage instructions, click on the sorting algorithm names below and refer to the comments and parameters:
- [&raquo; Bubble Sort](src/sorts/bubble/index.ts)
- [&raquo; Short Bubble Sort](src/sorts/bubble/short/index.ts)
- [&raquo; Cocktail Sort](src/sorts/cocktail/index.ts)
- [&raquo; Counting Sort](src/sorts/counting/index.ts)
- [&raquo; Counting Sort (Optimized Version)](src/sorts/counting/optimized/index.ts)
- [&raquo; Heap Sort](src/sorts/heap/index.ts)
- [&raquo; Insertion Sort](src/sorts/insertion/index.ts)
- [&raquo; Merge Sort](src/sorts/merge/index.ts)
- [&raquo; Pancake Sorting](src/sorts/pancake/index.ts)
- [&raquo; Quick Sort](src/sorts/quick/index.ts)
- [&raquo; Radix Sort](src/sorts/radix/index.ts)
- [&raquo; Selection Sort](src/sorts/selection/index.ts)
- [&raquo; Shell Sort](src/sorts/shell/index.ts)
- [&raquo; Tim Sort](src/sorts/tim/index.ts)
Loading

0 comments on commit 0415341

Please sign in to comment.