Skip to content

fix(sorts): make smoothsort generic over Comparable items - #15441

Open
wanjinhao1 wants to merge 1 commit into
TheAlgorithms:masterfrom
wanjinhao1:agent/fix-15234-smoothsort-generic
Open

wanjinhao1 wants to merge 1 commit into
TheAlgorithms:masterfrom
wanjinhao1:agent/fix-15234-smoothsort-generic

Conversation

@wanjinhao1

Copy link
Copy Markdown

Describe your change

  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Add or change doctests? -- Note: Please avoid changing both code and tests in a single pull request.
  • Documentation change?

Checklist

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues, then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

Part of #15234 (does not close the tracking issue).

What

  • Adds the shared Comparable protocol (__lt__ only) and a TypeVar bound so smoothsort (and its helpers _sift / _trinkle) accept any list of mutually comparable items (list[T]) instead of list[int].
  • Rewrites all comparisons in _sift and _trinkle to use only < (the protocol guarantees nothing else): >= becomes not (a < b) and a > b becomes b < a, preserving stability semantics for total orders.
  • Adds doctests for strings, mixed int/float input, and the mixed-type TypeError failure mode (smoothsort([1, "a"])).
  • Registers smoothsort in the shared SORTS battery in tests/test_sorts.py, which also covers the non-comparable rejection case.

Why

smoothsort.py is one of the remaining unchecked comparison sorts in the #15234 checklist, with no open PR and no assignee.

Validation

  • python3 -m doctest sorts/smoothsort.py — all doctests pass (including the new string/float/TypeError cases)
  • python3 sorts/smoothsort.py — all doctests plus the built-in 5,000 random trials pass
  • python3 -m pytest tests/test_sorts.py -q — 394 passed (smoothsort now runs across the full shared CASES battery, including Person/Dog dataclasses, and the [1, "a"] rejection test)

Note: one algorithm per PR per the tracker guidance. This PR was completed with AI assistance under the supervision of the account owner (@wanjinhao1) — happy to address any review feedback.

@algorithms-keeper algorithms-keeper Bot added awaiting reviews This PR is ready to be reviewed enhancement This PR modified some existing files labels Sep 25, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting reviews This PR is ready to be reviewed enhancement This PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant