samsort: A stable adaptive mergesort implementation

[ bsd3, data, library ] [ Propose Tags ] [ Report a vulnerability ]

A stable adaptive mergesort implementation.


[Skip to Readme]

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0
Change log CHANGELOG.md
Dependencies base (>=4.11 && <5) [details]
Tested with ghc ==8.4.4, ghc ==8.6.5, ghc ==8.8.4, ghc ==8.10.7, ghc ==9.0.2, ghc ==9.2.8, ghc ==9.4.8, ghc ==9.6.4, ghc ==9.8.1
License BSD-3-Clause
Copyright (c) 2024 Soumik Sarkar
Author Soumik Sarkar
Maintainer soumiksarkar.3120@gmail.com
Category Data
Home page https://github.com/meooow25/samsort
Bug tracker https://github.com/meooow25/samsort/issues
Source repo head: git clone https://github.com/meooow25/samsort.git
Uploaded by meooow at 2024-05-05T09:34:27Z
Distributions NixOS:0.1.0.0, Stackage:0.1.0.0
Reverse Dependencies 2 direct, 1 indirect [details]
Downloads 80 total (8 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2024-05-05 [all 1 reports]

Readme for samsort-0.1.0.0

[back to package description]

samsort

Hackage Haskell-CI

A stable adapative mergesort implementation

Features

This is a lightweight library offering two high performance sort functions:

There are no dependencies outside of base. This means that this library is not tied to array abstractions from any particular library. This also means that you may need to write a few lines of code to get a MutableArray# or MutableByteArray# from your data, which can then be sorted. See HOWTO.md for a guide.

If you need to use this library in an environment where you cannot depend on other packages, you may simply copy the lone source file src/Data/SamSort.hs to your project.

Algorithm details

  • The sort is a comparison-based \(O(n \log n)\) mergesort.
  • The sort is stable, i.e. the order of equal elements in the input is preserved.
  • The sort is adaptive, i.e. the sort identifies and uses ascending and descending runs of elements occuring in the input to perform less work. As a result, the sort is \(O(n)\) for already sorted inputs.
  • The sort is the fastest among implementations from other libraries in most scenarios. See the benchmarks for details.

Known issues

Ideally, this library would offer only an algorithm, capable of sorting arrays of any flavor. To support different arrays we would need to rely on some abstraction, either from another library (like vector), or created here. We cannot do either of those while also keeping the library as lightweight as it is now.

Contributing

Questions, bug reports, documentation improvements, code contributions welcome! Please open an issue as the first step. Slow performance counts as a bug!