{"_id":"@aldogg/sorter","_rev":"13-4db25aa7df2681d0a98e3a0b077a56d1","name":"@aldogg/sorter","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.6":{"name":"@aldogg/sorter","version":"0.0.6","keywords":["sorter","bitmask","radix"],"author":{"name":"Aldo Gutierrez"},"license":"Apache-2.0","_id":"@aldogg/sorter@0.0.6","maintainers":[{"name":"aldogg","email":"aldo.agg@gmail.com"}],"homepage":"https://github.com/aldo-gutierrez/bitsorterJS#readme","bugs":{"url":"https://github.com/aldo-gutierrez/bitsorterJS/issues"},"dist":{"shasum":"d26992493415b15d730a7167638e4d780b4d664b","tarball":"https://registry.npmjs.org/@aldogg/sorter/-/sorter-0.0.6.tgz","fileCount":12,"integrity":"sha512-Y/v/5xhiGLbC9GLbOLltczy8WoziY1y7mJEEB1oxLPknNP9CEr2zbOaMNv9ymcXw0axPqSiHsUJrw+X+96Abfw==","signatures":[{"sig":"MEUCIQCv2tXgeb3bK/QWIrqgZxAELtpxl780XiEedgVynn8s2gIgMEcINRWJ6r63+wZCj9P8WodrYkyxl+idZ9Jld0eVIKI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":60443},"main":"main.js","type":"module","gitHead":"bd419c4516a4d51b086e08a6c55fa285214cb0a3","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aldogg","email":"aldo.agg@gmail.com"},"repository":{"url":"git+https://github.com/aldo-gutierrez/bitsorterJS.git","type":"git"},"_npmVersion":"8.1.2","description":"Radix, Radix sorter, BitMask, BitMask sorters, RadixBitMask sorter, bitmasksorter, bitmask-sorter, fastest sorter","directories":{},"_nodeVersion":"16.13.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sorter_0.0.6_1720817344175_0.07204877294227852","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"@aldogg/sorter","version":"0.0.7","keywords":["sorter","bitmask","radix"],"author":{"name":"Aldo Gutierrez"},"license":"Apache-2.0","_id":"@aldogg/sorter@0.0.7","maintainers":[{"name":"aldogg","email":"aldo.agg@gmail.com"}],"homepage":"https://github.com/aldo-gutierrez/bitsorterJS#readme","bugs":{"url":"https://github.com/aldo-gutierrez/bitsorterJS/issues"},"dist":{"shasum":"3eaae2867ee5444a738687525b592c4df0f7ab22","tarball":"https://registry.npmjs.org/@aldogg/sorter/-/sorter-0.0.7.tgz","fileCount":27,"integrity":"sha512-PkY8/7qkqUcJ3iyRadxLK7RBxeDTXx2gjck//e+GW+0C+qf31/zMMV1wpLIsqdS/l0Eu3MYTzy61Ld2WxW7J7w==","signatures":[{"sig":"MEUCICkzUj4KxrlqzeTE/D1sD/g7immH6FVCEFBngVPUlKPzAiEAqdHPLY3D41hKLF1ORjTA2i8p7Pe4yy3I81k6DD8kTTs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":112725},"main":"main.js","type":"module","gitHead":"788a1097e4579025b05fbdf5896cf7ce5d7e1975","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"aldogg","email":"aldo.agg@gmail.com"},"repository":{"url":"git+https://github.com/aldo-gutierrez/bitsorterJS.git","type":"git"},"_npmVersion":"10.9.2","description":"Radix, Radix sorter, BitMask, BitMask sorters, RadixBitMask sorter, bitMaskSorter, bitmask-sorter, fastest sorter","directories":{},"_nodeVersion":"22.13.0","_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.7.3"},"_npmOperationalInternal":{"tmp":"tmp/sorter_0.0.7_1736813929858_0.23094063842878398","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@aldogg/sorter","version":"0.0.8","description":"Radix, Radix sorter, BitMask, BitMask sorters, RadixBitMask sorter, bitMaskSorter, bitmask-sorter, fastest sorter","type":"module","main":"dist/index.cjs.js","module":"dist/index.esm.js","browser":"dist/index.es5.umd.js","types":"dist/index.d.ts","sideEffects":false,"scripts":{"clean":"rimraf dist","build:types":"tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist/types","bundle:types":"dts-bundle-generator -o dist/index.d.ts src/index.ts","build:rollup":"rollup -c","build":"npm run clean && npm run build:types && npm run bundle:types && npm run build:rollup","test":"mocha test/*unit-test*.js"},"repository":{"type":"git","url":"git+https://github.com/aldo-gutierrez/bitsorterJS.git"},"keywords":["sorter","bitmask","radix"],"author":{"name":"Aldo Gutierrez"},"license":"Apache-2.0","bugs":{"url":"https://github.com/aldo-gutierrez/bitsorterJS/issues"},"homepage":"https://github.com/aldo-gutierrez/bitsorterJS#readme","devDependencies":{"@babel/core":"^7.22.0","@babel/preset-env":"^7.22.0","@rollup/plugin-babel":"^7.0.0","@rollup/plugin-node-resolve":"^15.0.0","dts-bundle-generator":"^6.9.0","fast-sort":"^3.4.1","mocha":"^10.7.3","rimraf":"^5.0.10","rollup":"^3.30.0","rollup-plugin-esbuild":"^6.2.1","timsort":"^0.3.0","typescript":"^5.4.0"},"gitHead":"da49baaba1c81e04ed187fe0330cd601b77bf4eb","_id":"@aldogg/sorter@0.0.8","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-/GYSVnu9cMgkj+YV49MJIyILVWAV3yViKiqDvar5/wlDhnguxKPP9/HCAAn9G7CE+Ncp4WtsnHfAGBvQJTSH2w==","shasum":"161b971b08a1df3dab2d18cbdffa12bf01740b2e","tarball":"https://registry.npmjs.org/@aldogg/sorter/-/sorter-0.0.8.tgz","fileCount":12,"unpackedSize":943161,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDXluRYWw1QP5Lm223VyvjdUJtHE47wcq3uMiyGgR+nnQIhAK+7BZFa3Vr905dtm2E9R+iSrLhTezZBUpAuPabMH1i1"}]},"_npmUser":{"name":"aldogg","email":"aldo.agg@gmail.com"},"directories":{},"maintainers":[{"name":"aldogg","email":"aldo.agg@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sorter_0.0.8_1788061963577_0.4941431905569933"},"_hasShrinkwrap":false}},"time":{"created":"2023-05-12T21:15:32.136Z","modified":"2026-08-30T03:52:43.901Z","0.0.1":"2023-05-12T21:15:32.352Z","0.0.2":"2023-05-23T21:19:56.427Z","0.0.3":"2023-08-16T02:39:23.168Z","0.0.4":"2024-07-08T12:26:51.651Z","0.0.5":"2024-07-09T02:14:25.904Z","0.0.6":"2024-07-12T20:49:04.340Z","0.0.7":"2025-01-14T00:18:50.055Z","0.0.8":"2026-08-30T03:52:43.742Z"},"bugs":{"url":"https://github.com/aldo-gutierrez/bitsorterJS/issues"},"author":{"name":"Aldo Gutierrez"},"license":"Apache-2.0","homepage":"https://github.com/aldo-gutierrez/bitsorterJS#readme","keywords":["sorter","bitmask","radix"],"repository":{"type":"git","url":"git+https://github.com/aldo-gutierrez/bitsorterJS.git"},"description":"Radix, Radix sorter, BitMask, BitMask sorters, RadixBitMask sorter, bitMaskSorter, bitmask-sorter, fastest sorter","maintainers":[{"name":"aldogg","email":"aldo.agg@gmail.com"}],"readme":"# BitMask Sorters in JavaScript: 2x to 20x faster\r\n\r\n[NPMJS](https://www.npmjs.com/package/@aldogg/sorter)\r\n[Repository](https://github.com/aldo-gutierrez/bitmasksorterJS)\r\n\r\nThis project explores sorting algorithms that use a BitMask optimization to improve performance.\r\n\r\nThe following code demonstrates how to calculate the BitMask of a 32-bit integer:\r\n\r\n```javascript\r\nfunction calculateMaskInt(array, start, endP1) {\r\n    let mask = 0x00000000;\r\n    let invMask = 0x00000000;\r\n\r\n    for (let i = start; i < endP1; i++) {\r\n        const ei = array[i];\r\n        mask = mask | ei;\r\n        invMask = invMask | (~ei);\r\n    }\r\n\r\n    return mask & invMask;\r\n}\r\n```\r\n\r\nJavaScript numbers are stored as double-precision floating-point values following the IEEE 754 standard. However, JavaScript bit operations work on 32-bit integers. Because of this, we need to manage two masks: one for the lower 32 bits and one for the upper 32 bits.\r\n\r\nFor more details, see the original Java implementation:\r\n[Java Version and Documentation](https://github.com/aldo-gutierrez/bitmasksorter)\r\n\r\n## Main functions\r\n\r\nThis functions select the best algorithm, for bigger numbers most of the time a RadixBitSort\r\n\r\n- `sortInt32(array, options)` executes a unstable sort on arrays of integer numbers in the range `-2^31 ... 2^31 - 1`.\r\n- `sortFLoat64(array, options)` executes a unstable sort on arrays of numeric values.\r\n- `sortObjectByInt32Key(array, (x) => x.key, options)` executes a stable sort on arrays of objects with integer keys in the range `-2^31 ... 2^31 - 1`.\r\n- `sortObjectByFloat64Key(array, (x) => x.key, options)` executes a stable sort on arrays of objects with numeric keys.\r\n- `sort(array, (x) => x.key, options)` executes a stable sort on arrays of objects with key.\r\n- `sort(array, [{\"key\": (x) => x.key}, {\"key\", (x) => x.id}], options)` executes a stable sort on arrays of objects with multiples keys.\r\n\r\n## Usage\r\n\r\n### Sorting arrays of numbers\r\n\r\nThese methods automatically choose the best algorithm depending on the array size and value range.\r\n\r\n```javascript\r\nimport { sortInt32, sortFLoat64 } from \"@aldogg/sorter\";\r\n\r\n// Can sort negative and positive integer numbers in the range -2^31 ... 2^31 - 1\r\n// Supports arrays and typeArrays\r\nsortInt32(array, {\"order\":\"asc\"});\r\n\r\n// Can sort negative and positive IEEE 754 64-bit numbers\r\n// Supported arrays and TypeArrays\r\nsortFLoat64(array, {\"order\":\"desc\"});\r\n```\r\n\r\n### Sorting arrays of objects\r\n\r\nThese methods automatically choose the best algorithm depending on the array size and value range.\r\n\r\n```javascript\r\nimport { sortObjectByInt32Key, sortObjectByFloat64Key } from \"@aldogg/sorter\";\r\n\r\n// sortObjectInt can sort objects with negative and positive integer keys in the range -2^31 ... 2^31 - 1 only\r\nsortObjectByInt32Key(orig, (x) => x.id);\r\n\r\n// sortObjectNumber can sort objects with IEEE 754 numeric keys\r\nsortObjectByFloat64Key(orig, (x) => x.id);\r\n```\r\n\r\n### MultiSort\r\n\r\n\r\n```javascript\r\nimport { sort} from \"@aldogg/sorter\";\r\n\r\n// sort Array of numbers\r\nsort([1,9,-1,3,2,null], {\"order\":\"asc\", \"nulls\":\"first\"});\r\n\r\n// sort Array of Objects by key\r\nsort(arrayObj, (x) => x.id, {\"order\":\"asc\", \"nulls\":\"last\"});\r\n\r\n// sort Array of Objects by multiple keys\r\nsort(arrayObj, [{\"key\": (x) => x.time, type:\"float64\", order:\"asc\"}, {\"key\": (x) => x.year, type:\"int32\", order:\"desc\"}], {\"nulls\":\"last\"});\r\n```\r\n\r\n\r\n## RadixBitSorter\r\n\r\n`RadixBitSorter` is a radix sort that uses a BitMask to reduce the number of counting-sort iterations required. This modified radix sort can be between 2x and 20x faster than the standard JavaScript sort.\r\n\r\n`RadixBitSorter` is an LSD radix sorter.\r\n\r\nThe number of bits per iteration has been increased to 11 instead of the usual 8. For dual-core or lower-end machines, using 8 bits is recommended.\r\n\r\n## Benchmark environment\r\n\r\nEnvironment: AMD Ryzen 7 4800H processor, Node v16.13.2\r\n\r\n## Benchmark: integer numbers\r\n\r\n### Sorting 1 million integer elements ranging from 0 to 1 million\r\n\r\n| Algorithm            |     avg. time [ms] |\r\n|----------------------|-------------------:|\r\n| Native Sort          |                275 |\r\n| RadixBitIntSorter    |                 21 |\r\n| RadixBitNumberSorter |                 41 |\r\n| PCountBitSortInt32   |                 18 | \r\n| Fast-sort            |                342 | \r\n| Timsort              |                149 | \r\n\r\n### Sorting 1 million integer elements ranging from 0 to 1000\r\n\r\n| Algorithm           |     avg. time [ms] |\r\n|---------------------|-------------------:|\r\n| Native Sort         |                220 |  \r\n| RadixBitSortInt32   |                 11 |\r\n| RadixBitSortFloat64 |                 32 |\r\n| PCountBitSortInt32  |                  4 |\r\n| Fast-sort 3.4.1     |                286 |\r\n| Timsort 0.3.0       |                118 |\r\n\r\n### Sorting 1 million integer elements ranging from 0 to 1,000,000,000\r\n\r\n| Algorithm           |       avg. time [ms] |\r\n|---------------------|---------------------:|\r\n| Native Sort         |                  271 |\r\n| RadixBitSortInt32   |                   29 |\r\n| RadixBitSortFloat64 |                   51 |\r\n| Fast-sort 3.4.1     |                  350 |\r\n| Timsort 0.3.0       |                  141 |                   \r\n\r\n### Sorting 40 million integer elements ranging from 0 to 1,000,000,000\r\n\r\n| Algorithm                | avg. time [ms] |\r\n|--------------------------|---------------:|\r\n| Native Sort              |          13572 |\r\n| RadixBitSortInt32 v0.7   |          11123 |\r\n| RadixBitSortFloat64 v0.7 |           4539 |\r\n| RadixBitSortInt32 v0.8   |           8439 |\r\n| RadixBitSortFloat64 v0.8 |           2187 |\r\n| Fast-sort 3.4.1          |          17286 |\r\n| Timsort 0.3.0            |           6902 |\r\n\r\n## Benchmark: floating-point numbers\r\n\r\n### Sorting 1 million floating-point elements ranging from 0 to 1 million\r\n\r\n| Algorithm                | avg. time [ms] |\r\n|--------------------------|---------------:|\r\n| Native sort              |            604 |\r\n| RadixBitSortFloat64 v0.8 |             67 |\r\n| Fast-sort 3.4.1          |            638 |\r\n| Timsort 0.3.0            |            186 |\r\n\r\n### Sorting 1 million floating-point elements ranging from 0 to 1000\r\n\r\n| Algorithm                | avg. time [ms] |\r\n|--------------------------|---------------:|\r\n| Native sort              |            597 |\r\n| RadixBitSortFloat64 v0.8 |             67 |\r\n| Fast-sort 3.4.1          |            747 |\r\n| Timsort 0.3.0            |            183 |\r\n\r\n### Sorting 1 million floating-point elements ranging from 0 to 1,000,000,000\r\n\r\n| Algorithm            | avg. time [ms] |\r\n|----------------------|---------------:|\r\n| Native sort          |            598 |\r\n| RadixBitNumberSorter |             68 |\r\n| Fast-sort 3.4.1      |            710 |\r\n| Timsort 0.3.0        |            184 |\r\n\r\n## Benchmark: objects\r\n\r\n### Sorting 1 million objects with integer keys ranging from 0 to 1 million\r\n\r\n| Algorithm                      | avg. time [ms] |\r\n|--------------------------------|---------------:|\r\n| Native sort                    |            535 |\r\n| RadixBitSortObjectByInt32Key   |            118 |\r\n| RadixBitV2SortObjectByInt32Key |             48 |\r\n| RadixBitSortObjectByFloat64Key |             81 |\r\n| Fast-sort 3.4.0                |            596 |\r\n| Timsort 0.3.0                  |            299 |\r\n\r\n### Sorting 1 million objects with integer keys ranging from 0 to 1000\r\n\r\n| Algorithm                      | avg. time [ms] |\r\n|--------------------------------|---------------:|\r\n| Native sort                    |            279 |\r\n| RadixBitSortObjectByInt32Key   |             19 |\r\n| RadixBitV2SortObjectByInt32Key |             31 |\r\n| RadixBitSortObjectByFloat64Key |             59 |\r\n| Fast-sort 3.4.0                |            322 |\r\n| Timsort 0.3.0                  |            168 |\r\n\r\n### Sorting 1 million objects with integer keys ranging from 0 to 1,000,000,000\r\n\r\n| Algorithm                      | avg. time [ms] |\r\n|--------------------------------|---------------:|\r\n| Native sort                    |            521 |\r\n| RadixBitSortObjectByInt32Key   |            218 |\r\n| RadixBitV2SortObjectByInt32Key |             64 |\r\n| RadixBitSortObjectByFloat64Key |            100 |\r\n| Fast-sort 3.4.0                |            618 |\r\n| Timsort 0.3.0                  |            315 |\r\n\r\n### Sorting 1 million objects with floating-point keys ranging from 0 to 1 million\r\n\r\n| Algorithm                           | avg. time [ms] |\r\n|-------------------------------------|---------------:|\r\n| Native Sort                         |            835 |\r\n| RadixBitSortObjectByFloat64Key v0.8 |            162 |\r\n| RadixBitSortObjectByFloat64Key v0.7 |            183 |\r\n| fast-sort 3.4.0                     |            784 |\r\n| Timsort                             |            422 |\r\n\r\n### Sorting 1 million objects with floating-point keys ranging from 0 to 1000\r\n\r\n| Algorithm                           | avg. time [ms] |\r\n|-------------------------------------|---------------:|\r\n| Native Sort                         |            855 |\r\n| RadixBitSortObjectByFloat64Key v0.8 |            165 |\r\n| RadixBitSortObjectByFloat64Key v0.7 |            189 |\r\n| fast-sort 3.4.0                     |            781 |\r\n| Timsort                             |            426 |\r\n\r\n### Sorting 1 million objects with floating-point keys ranging from 0 to 1,000,000,000\r\n\r\n| Algorithm                      | avg. time [ms] |\r\n|--------------------------------|---------------:|\r\n| Native Sort                    |            825 |\r\n| RadixBitSortObjectByFloat64Key |            165 |\r\n| fast-sort 3.4.0                |            764 |\r\n| Timsort                        |            421 |\r\n\r\n## DONE v0.8\r\n\r\n- [x] Support integer positive numbers\r\n- [x] Support integer negative numbers\r\n- [x] Support floating-point numbers\r\n- [x] Support object sort with integer keys\r\n- [x] Support object sort with float keys\r\n- [x] Support Stable sort\r\n- [x] Support nulls and undefined\r\n- [X] Support `asc` and `desc` order\r\n- [x] Support Radix Sort with BitMask → RadixBitXXXSorter\r\n- [x] Support Quick Sort with BitMask → QuickBitXXXSorter\r\n- [x] Test Pigeonhole Sort / Count Sort / Bucket Sort with BitMask → PCountBitXXXSorter (Only 32 bits)\r\n- [x] Test American Flag Sort with BitMask → AmericanBitXXXSorter (Only 32 bits)\r\n- [x] Full Regression and Smoke Test\r\n- [x] Benchmark Scripts\r\n- [x] Support String sorting by falling back to native JavaScript sort\r\n- [x] Support Boolean sorting by falling back to native JavaScript sort\r\n\r\n## TODO OPENSOURCE VERSION\r\n- [ ] Create ShortListRangeSorter similar to Java Version which will choose the best algorithm when n <= 2^16 or range <= 2^16. The best algorithm is selected from PCountSort, QuickBitSort, RadixBitSort and native Java Script sort.\r\n\r\n## OPEN SOURCE FINAL VERSION\r\n* RadixBitSorter for all needed types\r\n* QuickBitSorter for all needed types\r\n* RadixBitSorter / QuickBitSorter using optionally ShortListOrRangeSorter\r\n\r\n## PAID VERSION\r\n* RadixBitXXXSorter for all types\r\n* QuickBitXXXSorter for all types\r\n* PCountBitXXXSorter for all types\r\n* AmericanFlagBitSorter / SkaBitSorter for all types\r\n* Optimized String Sorting, maybe with BitMask\r\n* Support for sorting int64 and BigInt up to 2^64\r\n* Parallelism\r\n* Full code coverage\r\n* WebAssembly (*Pro version)\r\n* SIMD (*Pro version)\r\n* Support for sorting BigInt up to 2^128 (*Pro version)\r\n* Other sort algorithms with BitMask (*Pro version)\r\n","readmeFilename":"README.md"}