chore: 添加eslint配置

This commit is contained in:
LouisFonda 2024-02-27 17:39:09 +08:00
parent 5e75cede11
commit 2a49cef39a
12 changed files with 562 additions and 427 deletions

View File

@ -3,11 +3,25 @@
"browser": true,
"es2021": true
},
"extends": "airbnb-base",
"extends": ["airbnb-base"],
"plugins": ["prettier"],
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
"no-plusplus": "off", // i++,i--
"no-use-before-define": "off", //
"no-console": "off",
"import/extensions": [
"error",
"ignorePackages", // node_modules
{
"mjs": "always", // .mjs
"js": "always", // .js
"ts": "always" // .ts
}
],
"no-param-reassign": "off"
}
}

114
package-lock.json generated
View File

@ -11,7 +11,9 @@
"devDependencies": {
"eslint": "^8.57.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-import": "^2.29.1"
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@ -147,6 +149,18 @@
"node": ">= 8"
}
},
"node_modules/@pkgr/core": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
"dev": true,
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/unts"
}
},
"node_modules/@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@ -753,6 +767,18 @@
"eslint-plugin-import": "^2.25.2"
}
},
"node_modules/eslint-config-prettier": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
"dev": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
"peerDependencies": {
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-import-resolver-node": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
@ -851,6 +877,36 @@
"node": ">=0.10.0"
}
},
"node_modules/eslint-plugin-prettier": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
"integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
"dev": true,
"dependencies": {
"prettier-linter-helpers": "^1.0.0",
"synckit": "^0.8.6"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint-plugin-prettier"
},
"peerDependencies": {
"@types/eslint": ">=8.0.0",
"eslint": ">=8.0.0",
"eslint-config-prettier": "*",
"prettier": ">=3.0.0"
},
"peerDependenciesMeta": {
"@types/eslint": {
"optional": true
},
"eslint-config-prettier": {
"optional": true
}
}
},
"node_modules/eslint-scope": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@ -944,6 +1000,12 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"node_modules/fast-diff": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
"dev": true
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@ -1899,6 +1961,34 @@
"node": ">= 0.8.0"
}
},
"node_modules/prettier": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
"integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
"dev": true,
"peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/prettier-linter-helpers": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"dependencies": {
"fast-diff": "^1.1.2"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@ -2237,6 +2327,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/synckit": {
"version": "0.8.8",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
"integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
"dev": true,
"dependencies": {
"@pkgr/core": "^0.1.0",
"tslib": "^2.6.2"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/unts"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -2255,6 +2361,12 @@
"strip-bom": "^3.0.0"
}
},
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dev": true
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",

View File

@ -3,7 +3,10 @@
"version": "1.0.0",
"description": "一个记录个人算法练习的仓库",
"main": "index.js",
"scripts": {},
"scripts": {
"eslint": "eslint **/*js **/*.mjs",
"fix": "eslint **/*js **/*.mjs --fix"
},
"repository": {
"type": "git",
"url": "https://gitea-icoding.ddnsto.com/yigencong/algorithm.git"
@ -19,6 +22,8 @@
"devDependencies": {
"eslint": "^8.57.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-import": "^2.29.1"
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3"
}
}

View File

@ -1,15 +1,18 @@
import {generateRandomArray, measureTime} from "../util/index.mjs"
import { bubbleSort, bubbleSort2, bubbleSort3, cocktailSort } from "./bubble-sort.mjs"
const arr = generateRandomArray(10000)
const arr2 = generateRandomArray(10000)
// const arr3 = generateRandomArray(10000)
// measureTime(bubbleSort, arr)
// measureTime(bubbleSort2, arr2)
// measureTime(bubbleSort3, arr3)
import { generateRandomArray, measureTime } from '../util/index.mjs';
import {
bubbleSort,
bubbleSort2,
bubbleSort3,
cocktailSort,
} from './bubble-sort.mjs';
const arr = generateRandomArray(10000);
const arr2 = generateRandomArray(10000);
const arr3 = generateRandomArray(10000);
measureTime(bubbleSort, arr);
measureTime(bubbleSort2, arr2);
measureTime(bubbleSort3, arr3);
// 鸡尾酒排序测试
measureTime(cocktailSort, arr)
measureTime(bubbleSort, arr2)
measureTime(cocktailSort, arr);
measureTime(bubbleSort, arr2);

View File

@ -1,11 +1,13 @@
import {swap} from "../util/index.mjs"
import { swap } from '../util/index.mjs';
export function bubbleSort(arr) {
let n = arr.length
for (let i = 1;i < n; i++) { // 理解为何i从1开始因为冒泡排序是两两比较的此循环只是限制比较的次数
for(let j = 0;j < n-i;j++) { // 此循环才是排序的关键,当当前值大于后一个值时交换位置,没做完一遍最后一个值永远是本轮循环最大的
if (arr[j] > arr[j+1]){
swap(arr, j, j+1)
const n = arr.length;
for (let i = 1; i < n; i++) {
// 理解为何i从1开始因为冒泡排序是两两比较的此循环只是限制比较的次数
for (let j = 0; j < n - i; j++) {
// 此循环才是排序的关键,当当前值大于后一个值时交换位置,没做完一遍最后一个值永远是本轮循环最大的
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
@ -13,60 +15,64 @@ export function bubbleSort(arr) {
// 优化方案1
export function bubbleSort2(arr) {
let n = arr.length;
for (let i = 1;i<n;i++) {
let hasSort = true // 添加标志位,默认是有序的,在一轮比较下来如果没有发生交换,说明整个数组就是有序的,直接结束排序
for (let j = 0; j<n-i;j++){
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1)
hasSort = false // 交换元素之后,设置标志位为无序状态
const n = arr.length;
for (let i = 1; i < n; i++) {
let hasSort = true; // 添加标志位,默认是有序的,在一轮比较下来如果没有发生交换,说明整个数组就是有序的,直接结束排序
for (let j = 0; j < n - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
hasSort = false; // 交换元素之后,设置标志位为无序状态
}
}
if (hasSort == true) {
break
if (hasSort === true) {
break;
}
}
}
// 优化方案2
export function bubbleSort3(arr) {
let n = arr.length, k = n-1, swapPos = 0;
for (let i = 1;i<n;i++) {
let hasSort = true // 添加标志位,默认是有序的,在一轮比较下来如果没有发生交换,说明整个数组就是有序的,直接结束排序
for (let j = 0; j< k;j++){
if(arr[j] > arr[j+1]) {
swap(arr, j, j+1)
hasSort = false // 交换元素之后,设置标志位为无序状态
swapPos = j // 记录最后一次交换的元素的位置
const n = arr.length;
let k = n - 1;
let swapPos = 0;
for (let i = 1; i < n; i++) {
let hasSort = true; // 添加标志位,默认是有序的,在一轮比较下来如果没有发生交换,说明整个数组就是有序的,直接结束排序
for (let j = 0; j < k; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
hasSort = false; // 交换元素之后,设置标志位为无序状态
swapPos = j; // 记录最后一次交换的元素的位置
}
}
if (hasSort == true) {
break
if (hasSort === true) {
break;
}
k = swapPos // 把最后一次交换的位置给k之后的排序支队1 - n-k的元素进行比较因为之后的元素都是有序的
k = swapPos; // 把最后一次交换的位置给k之后的排序支队1 - n-k的元素进行比较因为之后的元素都是有序的
}
}
// 鸡尾酒排序(冒泡排序变形)
export function cocktailSort(arr) {
let left = 0, right = arr.length - 1, index;
while(left < right) {
let left = 0;
let right = arr.length - 1;
let index;
while (left < right) {
// 大的排在后面
for (let i = left;i < right;i++) {
if (arr[i] > arr[i+1]) {
swap(arr, i, i+1)
index = i
for (let i = left; i < right; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
index = i;
}
}
// 第一轮排完之后index右侧的数字都是有序的,只需从index开始排就行重点
right = index
right = index;
// 小的排前面
for (let i = right;i > left;i--) {
if (arr[i] < arr[i-1]) {
swap(arr, i, i-1)
index = i
for (let i = right; i > left; i--) {
if (arr[i] < arr[i - 1]) {
swap(arr, i, i - 1);
index = i;
}
}
left = index
left = index;
}
}

View File

@ -1,18 +1,18 @@
import { generateRandomArray, isSort } from "../util/index.mjs";
/**
* 插入排序
* @param {number[]} arr
*/
export function insertionSort(arr){
let n = arr.length;
for (let i = 1; i<n; i++) {
let currentElement = arr[i]
let j = i-1
while(j>=0 && arr[j] > currentElement) {
arr[j+1] = arr[j]
j--
function insertionSort(arr) {
const n = arr.length;
for (let i = 1; i < n; i++) {
const currentElement = arr[i];
let j = i - 1;
while (j >= 0 && arr[j] > currentElement) {
arr[j + 1] = arr[j];
j--;
}
arr[j+1] = currentElement
arr[j + 1] = currentElement;
}
}
export default insertionSort;

View File

@ -3,7 +3,7 @@
* @param {number[]} left - 需要合并的左数组
* @param {number[]} right - 需要合并的右数组
*/
export function mergeSort(arr) {
export function mergeSort(arr) {
if (arr.length <= 1) {
return arr; // 已经有序
}
@ -22,7 +22,7 @@
}
function merge(left, right) {
let result = [];
const result = [];
let leftIndex = 0;
let rightIndex = 0;
@ -40,3 +40,5 @@ function merge(left, right) {
// 将剩余的元素加入结果数组
return result.concat(left.slice(leftIndex), right.slice(rightIndex));
}
export default mergeSort;

View File

@ -1,22 +1,21 @@
import { swap } from "../util/index.mjs"
import { swap } from '../util/index.mjs';
/**
*
* @param {number[]} arr
* @param {number[]} array - 需要排序的数组
*/
export function quickSort(arr) {
export function quickSort(array) {
function QuickSort(arr, left, right) {
if (left < right) {
let index = partition(arr, left, right)
QuickSort(arr, left, index-1) // index是中心轴无需参与排序,若写成index会造成堆栈益处
QuickSort(arr, index+1, right)
const index = partition(arr, left, right);
QuickSort(arr, left, index - 1); // index是中心轴无需参与排序,若写成index会造成堆栈益处
QuickSort(arr, index + 1, right);
}
}
QuickSort(arr,0, arr.length - 1)
return arr
QuickSort(array, 0, array.length - 1);
return array;
}
/**
* @description 使用左右指针法来分数组
* @param {number[]} arr - 需要分治的函数
@ -24,37 +23,37 @@ export function quickSort(arr) {
* @param {number} right - 结束的位置
*/
function partition(arr, left, right) {
let pivot = arr[right] // 以right作为pivot
let pivotIndex = right
const pivot = arr[right]; // 以right作为pivot
const pivotIndex = right;
while (left < right) {
// left开始往右边找比pivot大的值
while (left < right && arr[left] <= pivot) {
left++
left++;
}
// right开始往左边找比pivot小的值
while (left < right && arr[right] >= pivot) {
right--
right--;
}
swap(arr, left, right)
swap(arr, left, right);
}
swap(arr, left, pivotIndex)
return left
swap(arr, left, pivotIndex);
return left;
}
/**
*
* @param {number[]} arr - 需要快速排序的数组
* @param {number[]} array - 需要快速排序的数组
*/
export function quickSort2(arr){
export function quickSort2(array) {
function QuickSort(arr, left, right) {
if (left < right) {
const pivot = partition2(arr, left, right)
QuickSort(arr,left,pivot -1)
QuickSort(arr, pivot+1, right)
const pivot = partition2(arr, left, right);
QuickSort(arr, left, pivot - 1);
QuickSort(arr, pivot + 1, right);
}
}
QuickSort(arr,0, arr.length-1)
QuickSort(array, 0, array.length - 1);
}
/**
@ -63,35 +62,35 @@ export function quickSort2(arr){
* @param {number} left - 开始的位置
* @param {number} right - 结束的位置
*/
function partition2(arr, left, right){
let pivot = arr[right]
while(left < right) {
while(left<right && arr[left] <= pivot) {
left++
function partition2(arr, left, right) {
const pivot = arr[right];
while (left < right) {
while (left < right && arr[left] <= pivot) {
left++;
}
arr[right] = arr[left]
while(left<right && arr[right] >= pivot) {
right--
arr[right] = arr[left];
while (left < right && arr[right] >= pivot) {
right--;
}
arr[left] = arr[right]
arr[left] = arr[right];
}
arr[left] = pivot
return left
arr[left] = pivot;
return left;
}
/**
* @description 使用前后指针法分数组
* @param {number[]} arr - 需要排序的数组
* @param {number[]} array - 需要排序的数组
*/
export function quickSort3(arr) {
export function quickSort3(array) {
function QuickSort(arr, left, right) {
if(left < right){
const pivot = partition4(arr, left, right)
QuickSort(arr, left, pivot-1)
QuickSort(arr, pivot+1, right)
if (left < right) {
const pivot = partition4(arr, left, right);
QuickSort(arr, left, pivot - 1);
QuickSort(arr, pivot + 1, right);
}
}
QuickSort(arr, 0, arr.length -1)
QuickSort(array, 0, array.length - 1);
}
/**
@ -100,21 +99,22 @@ export function quickSort3(arr) {
* @param {number} left - 开始的位置
* @param {number} right - 结束的位置
*/
function partition3(arr, left, right){
let cur = left
let pre = left - 1
const pivot = arr[right] // 选取最后一个元素作为中枢
while(cur < right) {
if(arr[cur]< pivot) {
swap(arr, cur, ++pre)
// eslint-disable-next-line no-unused-vars
function partition3(arr, left, right) {
let cur = left;
let pre = left - 1;
const pivot = arr[right]; // 选取最后一个元素作为中枢
while (cur < right) {
if (arr[cur] < pivot) {
swap(arr, cur, ++pre);
}
cur++
cur++;
}
/*
循环结束之后pre所处的元素之前都是小于pivot包含pre,右侧的元素都是大于或等于pivot的交换cur+1和pviot的值
*/
swap(arr, pre +1, right)
return pre + 1
swap(arr, pre + 1, right);
return pre + 1;
}
/**
@ -123,66 +123,65 @@ function partition3(arr, left, right){
* @param {number} left - 开始的位置
* @param {number} right - 结束的位置
*/
function partition4(arr, left, right){
let cur = left
let pre = left - 1
const pivot = arr[right] // 选取最后一个元素作为中枢
while(cur < right) {
if(arr[cur] < pivot && ++pre != cur) {
swap(arr, pre, cur)
function partition4(arr, left, right) {
let cur = left;
let pre = left - 1;
const pivot = arr[right]; // 选取最后一个元素作为中枢
while (cur < right) {
if (arr[cur] < pivot && ++pre !== cur) {
swap(arr, pre, cur);
}
cur++
cur++;
}
/*
循环结束之后pre所处的元素之前都是小于pivot包含pre,右侧的元素都是大于或等于pivot的交换cur+1和pviot的值
*/
swap(arr, pre +1, right)
return pre + 1
swap(arr, pre + 1, right);
return pre + 1;
}
/**
* @description 使用非递归方式实现快速排序
* @param {number[]} arr - 需要排序的数组
*/
export function quickSort4(arr){
if ( !arr.length || arr.length ==1 ) return // 数组为空或者数组为1不处理
let left = 0
let right = arr.length - 1
const stack = [] // js的数组有push和pop符合栈结构
stack.push(right)
stack.push(left)
while(stack.length) {
const l = stack.pop() // 弹出需要处理的左边l
const r = stack.pop() // 弹出需要处理的有边界
const pivot = partition4(arr, l, r)
export function quickSort4(arr) {
if (!arr.length || arr.length === 1) return; // 数组为空或者数组为1不处理
const left = 0;
const right = arr.length - 1;
const stack = []; // js的数组有push和pop符合栈结构
stack.push(right);
stack.push(left);
while (stack.length) {
const l = stack.pop(); // 弹出需要处理的左边l
const r = stack.pop(); // 弹出需要处理的有边界
const pivot = partition4(arr, l, r);
// l < pivot - 1 说明还可以分当l = pivot -1 说明pivot左侧就一个数说明左侧已经有序了无须再分
if(l < pivot - 1) {
stack.push(pivot - 1)
stack.push(l)
if (l < pivot - 1) {
stack.push(pivot - 1);
stack.push(l);
}
if(right > pivot + 1) {
stack.push(r)
stack.push(pivot + 1)
if (right > pivot + 1) {
stack.push(r);
stack.push(pivot + 1);
}
}
}
export function quickSort5(arr) {
let stack = []
stack.push(arr.length - 1)
stack.push(0)
while(stack.length) {
let l = stack.pop()
let r = stack.pop()
let index = partition4(arr, l, r)
const stack = [];
stack.push(arr.length - 1);
stack.push(0);
while (stack.length) {
const l = stack.pop();
const r = stack.pop();
const index = partition4(arr, l, r);
if (l < index - 1) {
stack.push(index-1)
stack.push(l)
stack.push(index - 1);
stack.push(l);
}
if(r > index+1){
stack.push(r)
stack.push(index + 1)
if (r > index + 1) {
stack.push(r);
stack.push(index + 1);
}
}
}

View File

@ -1,4 +1,4 @@
import { generateRandomArray, isSort, swap } from "../util/index.mjs"
import { swap } from '../util/index.mjs';
/**
*
@ -6,12 +6,12 @@ import { generateRandomArray, isSort, swap } from "../util/index.mjs"
* @description 朴素的冒泡排序
*/
export function selectSort(arr) {
let len = arr.length
for(let i = 0; i< len; i++) {
let minIndex = i
for(let j = i+1; j < len; j++) { // 找到本轮最小的值
if(arr[j] < arr[minIndex]) {
minIndex = j
const len = arr.length;
for (let i = 0; i < len; i++) {
let minIndex = i;
for (let j = i + 1; j < len; j++) { // 找到本轮最小的值
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
swap(arr, i, minIndex); // 交换最小值和选择值的下标
@ -23,7 +23,7 @@ export function selectSort(arr) {
* @param {number[]} arr
* @description 两端同时排序类似鸡尾酒排序
*/
function selectSort2(arr) {
export function selectSort2(arr) {
let left = 0;
let right = arr.length - 1;
@ -57,13 +57,6 @@ export function selectSort(arr) {
}
}
let arr = generateRandomArray(10)
console.log(arr);
selectSort2(arr)
console.log(isSort(arr));
console.log(arr);
// 实际比较下来优化后的选择排序也没太大作用(实际开发不应使用这种排序,主要学习其解决思路)
export default selectSort;

View File

@ -1,4 +1,3 @@
import { generateRandomArray, isSort } from "../util/index.mjs";
/*
希尔排序的性能与所选的间隔序列shell序列有关以下是几种常见的希尔排序序列
Hibbard 序列:
@ -21,31 +20,30 @@ H(k) = 3^k + 1
*
* @param {number[]} arr
*/
export function shellSort(arr){
const n = arr.length
export function shellSort(arr) {
const n = arr.length;
// 创建希尔序列,以克努特序列为例
let gap = 1;
while (gap < n / 3) {
gap = gap*3 +1
gap = gap * 3 + 1;
}
while(gap>=1) {
while (gap >= 1) {
// 正常插入排序
for (let i = 0;i<gap; i++){
for(let j = i+gap;j < n;j+=gap){
let temp = arr[j]
while(j>0 && arr[j-gap] > temp) {
arr[j] = arr[j-gap]
j-=gap
for (let i = 0; i < gap; i++) {
for (let j = i + gap; j < n; j += gap) {
const temp = arr[j];
while (j > 0 && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp
arr[j] = temp;
}
}
// 正常插入排序
gap = Math.floor(gap/3)
gap = Math.floor(gap / 3);
}
}
/**
@ -53,20 +51,20 @@ export function shellSort(arr){
* @param {number[]} arr
*/
export function shellSort2(arr) {
let n = arr.length
let gap = Math.floor(n / 2)
const n = arr.length;
let gap = Math.floor(n / 2);
while (gap > 0) {
for(let i = 0;i<gap;i++) {
for(let j = i+gap;j<n;j+=gap){
const temp = arr[j]
while(j > 0 && arr[j-gap] > temp){ // 插入过程s
arr[j] = arr[j-gap]
j-=gap
for (let i = 0; i < gap; i++) {
for (let j = i + gap; j < n; j += gap) {
const temp = arr[j];
while (j > 0 && arr[j - gap] > temp) { // 插入过程s
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp
arr[j] = temp;
}
}
gap = Math.floor(gap / 2)
gap = Math.floor(gap / 2);
}
}
@ -74,20 +72,20 @@ export function shellSort2(arr) {
* 优化版本
* @param {number[]} arr
*/
export function shellSort3(arr){
const n = arr.length
let gap = Math.floor(n/2)
while (gap>0){ // 使用不同的gap对子数组排序
for(let i = gap; i<n;i++){
export function shellSort3(arr) {
const n = arr.length;
let gap = Math.floor(n / 2);
while (gap > 0) { // 使用不同的gap对子数组排序
for (let i = gap; i < n; i++) {
// 插入过程
let temp = arr[i]
let j = i
while(j>0 && arr[j-gap] > temp) {
arr[j] = arr[j-gap]
j-=gap
const temp = arr[i];
let j = i;
while (j > 0 && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp
arr[j] = temp;
}
gap = Math.floor(gap/2)
gap = Math.floor(gap / 2);
}
}

View File

@ -1,17 +1,21 @@
import { generateRandomArray, measureTime, isSort } from "../util/index.mjs";
import { shellSort } from "./shell-sort.mjs";
import {insertionSort } from "./insertion-sort.mjs"
import { bubbleSort } from "./bubble-sort.mjs"
import { mergeSort } from "./merge-sort.mjs";
import {quickSort, quickSort2, quickSort3, quickSort4, quickSort5} from "./quick-sort.mjs"
import { generateRandomArray, measureTime} from '../util/index.mjs';
import { shellSort } from './shell-sort.mjs';
import insertionSort from './insertion-sort.mjs';
import { bubbleSort } from './bubble-sort.mjs';
import { mergeSort } from './merge-sort.mjs';
import {
quickSort, quickSort2, quickSort3, quickSort4, quickSort5,
} from './quick-sort.mjs';
let arr = generateRandomArray(10)
const arr = generateRandomArray(100);
console.log(arr);
measureTime(bubbleSort,arr.slice())
measureTime(insertionSort,arr.slice())
measureTime(shellSort,arr.slice())
let mergeArr = measureTime(mergeSort, arr.slice()) // 归并排序会返回一个新数组,不对原数组修改
measureTime(quickSort,arr.slice())
measureTime(quickSort2,arr.slice()) // 挖坑法分解数组
measureTime(quickSort3,arr.slice()) // 前后指针分解数组
measureTime(quickSort4,arr) // 不使用递归处理
measureTime(bubbleSort, arr.slice());
measureTime(insertionSort, arr.slice());
measureTime(shellSort, arr.slice());
measureTime(mergeSort, arr.slice()); // 归并排序会返回一个新数组,不对原数组修改
measureTime(quickSort, arr.slice());
measureTime(quickSort2, arr.slice()); // 挖坑法分解数组
measureTime(quickSort3, arr.slice()); // 前后指针分解数组
measureTime(quickSort4, arr.slice()); // 不使用递归处理
measureTime(quickSort5, arr.slice()); // 去除不必要代码

View File

@ -6,9 +6,9 @@
* @description 交换数组中两个数的位置
*/
export function swap(array, a, b) {
let temp = array[a]
array[a] = array[b]
array[b] = temp
const temp = array[a];
array[a] = array[b];
array[b] = temp;
}
/**
@ -16,13 +16,13 @@ export function swap(array, a, b) {
* @returns {number[]} - 打乱后的数组
* @description 打乱数组内容
*/
function shuffle(arr) {
export function shuffle(arr) {
// 创建数组的副本,以防止修改原始数组
const shuffledArray = arr.slice();
// Fisher-Yates 洗牌算法
for (let i = shuffledArray.length - 1; i > 0; i--) {
const a =Math.random() * (i + 1)
const a = Math.random() * (i + 1);
console.log(a);
const j = Math.floor(a);
// 交换元素
@ -40,7 +40,7 @@ export function swap(array, a, b) {
* @param {number} decimals - 保留的小数位数默认为 2
* @returns {number[]} - 生成的随机数组
*/
export function generateRandomArray(len, decimal = false, decimals = 2) {
export function generateRandomArray(len, decimal = false, decimals = 2) {
const randomArray = [];
for (let i = 0; i < len; i++) {
@ -52,9 +52,9 @@ export function swap(array, a, b) {
}
return randomArray;
}
}
export function measureTime(func, ...args) {
export function measureTime(func, ...args) {
// 记录函数开始执行的时间戳
const startTime = performance.now();
@ -67,32 +67,31 @@ export function swap(array, a, b) {
// 打印执行时间
console.log(`Function execution time: ${elapsedTime} milliseconds`);
return result
}
return result;
}
export function isSort(arr) {
const len = arr.length
let isInverted = false
if(len <2) {
return true
export function isSort(arr) {
const len = arr.length;
let isInverted = false;
if (len < 2) {
return true;
}
// 判断数组是否倒序
if(arr[0] > arr[1]) {
isInverted = true
if (arr[0] > arr[1]) {
isInverted = true;
}
if(isInverted) {
for(let i=0;i<len-1;i++){
if(arr[i]<arr[i+1]){
return false
if (isInverted) {
for (let i = 0; i < len - 1; i++) {
if (arr[i] < arr[i + 1]) {
return false;
}
}
}else{
for(let i=0;i<len-1;i++){
if(arr[i]>arr[i+1]){
return false
} else {
for (let i = 0; i < len - 1; i++) {
if (arr[i] > arr[i + 1]) {
return false;
}
}
}
return true
}
return true;
}