{"id":20551589,"url":"https://github.com/clarketm/super","last_synced_at":"2025-04-14T11:31:05.020Z","repository":{"id":57102379,"uuid":"133031722","full_name":"clarketm/super","owner":"clarketm","description":"Data structures, data types, and algorithms with superpowers! 💪😎","archived":false,"fork":false,"pushed_at":"2019-04-28T09:18:47.000Z","size":3961,"stargazers_count":13,"open_issues_count":0,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-28T00:44:03.785Z","etag":null,"topics":["array","binarytree","data-structures","data-types","heap","javascript","linkedlist","map","math","number","object","priorityqueue","queue","set","sorting-algorithms","string","super","superpowers","trie"],"latest_commit_sha":null,"homepage":"https://blog.travismclarke.com/project/super","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/clarketm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-05-11T11:31:48.000Z","updated_at":"2024-06-19T23:05:45.000Z","dependencies_parsed_at":"2022-08-20T22:10:26.855Z","dependency_job_id":null,"html_url":"https://github.com/clarketm/super","commit_stats":null,"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarketm%2Fsuper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarketm%2Fsuper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarketm%2Fsuper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarketm%2Fsuper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/clarketm","download_url":"https://codeload.github.com/clarketm/super/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248871720,"owners_count":21175282,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["array","binarytree","data-structures","data-types","heap","javascript","linkedlist","map","math","number","object","priorityqueue","queue","set","sorting-algorithms","string","super","superpowers","trie"],"created_at":"2024-11-16T02:32:20.581Z","updated_at":"2025-04-14T11:31:04.989Z","avatar_url":"https://github.com/clarketm.png","language":"JavaScript","readme":"# [Super](https://www.npmjs.com/package/@clarketm/super)\n\n[![NPM release](https://img.shields.io/npm/v/@clarketm/super.svg)](https://www.npmjs.com/package/@clarketm/super)\n[![Build Status](https://circleci.com/gh/clarketm/super.svg?style=shield)](https://circleci.com/gh/clarketm/super)\n[![Downloads](https://img.shields.io/npm/dt/@clarketm/super.svg)](https://www.npmjs.com/package/@clarketm/super)\n[![Lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lernajs.io/)\n[![License](https://img.shields.io/npm/l/@clarketm/super.svg)](LICENSE.md)\n\n**Data structures**, **data types**, and **algorithms** with superpowers! 💪😎\n\n\u003csub\u003eimplemented in **JavaScript**.\u003c/sub\u003e\n\n\u003ca href=\"https://github.com/clarketm/super\"\u003e\n  \u003cp align=\"center\"\u003e\u003cimg src=\"https://blog.travismclarke.com/assets/img/Hero-Super.png\" /\u003e\u003c/p\u003e\n\u003c/a\u003e\n\u003cbr\u003e\n\n\u003e _\"JavaScript's missing data structures, data types, and algorithms!\"_ - Mark Twain\n\n\u003cbr\u003e\n\n## Installation\n\n### Yarn\n\n```bash\n$ yarn add @clarketm/super\n```\n\n### Npm\n\n```bash\n$ npm install @clarketm/super --save\n```\n\n\u003cbr\u003e\n\n## Usage\n\n```js\n// 1. import `each` module `independently`\nimport { Array, Map, Queue, Trie, ... } from \"@clarketm/super\";\n\nlet array = new Array([1, 2]);\n...\n\n// 2. import `all` modules under a `namespace`\nimport Super from \"@clarketm/super\";\n\nlet array = new Super.Array([1, 2]);\n...\n```\n\n\u003cbr\u003e\n\n## Table of Contents\n\n#### Data Structures\n\n- [Array](#array)\n- [AVLTree](#avltree)\n- [BinaryTree](#binarytree)\n- [Heap](#heap)\n- [LinkedList](#linkedlist)\n- [Map](#map)\n- [Object](#object)\n- [PriorityQueue](#priorityqueue)\n- [Queue](#queue)\n- [Set](#set)\n- [Trie](#trie)\n\n#### Data Types\n\n- [Number](#number)\n- [Math](#math)\n- [String](#string)\n\n#### Sorting Algorithms\n\n- [BubbleSort](#bubblesort)\n- [InsertionSort](#insertionsort)\n- [MergeSort](#mergesort)\n- [QuickSort](#quicksort)\n- [SelectionSort](#selectionsort)\n\n\u003cbr\u003e\n\n## Data Structures\n\n### [Array](https://github.com/clarketm/super/tree/master/packages/Array#readme)\n\n```js\nimport { Array } from \"@clarketm/super\";\n\nlet array = new Array([0, 1, 2, 3]); // [0, 1, 2, 3]\n\n// Use any built-in Array methods:\narray.push(4); // [0, 1, 2, 3, 4]\n\n// Use custom methods (e.g. `flat`):\nlet array = new Array([[[1]], [[2]], [[3]]]);\narray.flat(2); // [1, 2, 3]\n\n// sorting\narray.bubbleSort(); // [0, 1, 2, 3]\narray.insertionSort(); // [0, 1, 2, 3]\narray.mergeSort(); // [0, 1, 2, 3]\narray.quickSort(); // [0, 1, 2, 3]\narray.selectionSort(); // [0, 1, 2, 3]\n\n// sorting (w/ comparator)\narray.bubbleSort((a, b) =\u003e b - a); // [3, 2, 1, 0]\narray.insertionSort((a, b) =\u003e b - a); // [3, 2, 1, 0]\narray.mergeSort((a, b) =\u003e b - a); // [3, 2, 1, 0]\narray.quickSort((a, b) =\u003e b - a); // [3, 2, 1, 0]\narray.selectionSort((a, b) =\u003e b - a); // [3, 2, 1, 0]\n```\n\n\u003cbr\u003e\n\n### [AVLTree](https://github.com/clarketm/super/tree/master/packages/AVLTree#readme)\n\n```js\nimport { AVLTree } from \"@clarketm/super\";\n\nlet tree = new AVLTree([1, 2, 3, 4, 5, 6, 7, 8]);\n\n//              4  -\u003e root\n//            /   \\\n//           2     6\n//         /  \\   /  \\\n//        1   3  5    7\n//                     \\\n//                      8\n//\n\ntree.root; // AVLTreeNode { _value: 5, ... }\ntree.height; // 1\n\ntree.insert(9);\n\n//              4  -\u003e root\n//            /   \\\n//           2     6\n//         /  \\   /  \\\n//        1   3  5    8\n//                   / \\\n//                  7   9\n//\n\ntree.balanced; // true\n\ntree.search(3); // AVLTreeNode { _value: 3, ... }\n\ntree.remove(9);\n\n//              4  -\u003e root\n//            /   \\\n//           2     6\n//         /  \\   /  \\\n//        1   3  5    8\n//                   /\n//                  7\n//\n\n// Use a custom comparator to determine tree hierarchy\n\n// string length (ascending) comparator\nlet tree = new AVLTree([\"green\", \"red\", \"blue\"], (a, b) =\u003e a.length - b.length);\n\n//            \"blue\"  -\u003e root\n//           /     \\\n//        \"red\"  \"green\"\n//\n\ntree.findMax().value; // \"green\"\n```\n\n\u003cbr\u003e\n\n### [BinaryTree](https://github.com/clarketm/super/tree/master/packages/BinaryTree#readme)\n\n```js\nimport { BinaryTree } from \"@clarketm/super\";\n\nlet tree = new BinaryTree([5, 3, 7, 2, 8, 4, 6, 1]);\n\n//              5  -\u003e root\n//            /   \\\n//           3     7\n//         /  \\   /  \\\n//        2   4  6    8\n//       /\n//      1\n\ntree.root; // BinaryTreeNode { _value: 5, ... }\ntree.height; // 1\n\ntree.insert(9);\n\n//              5  -\u003e root\n//            /   \\\n//           3     7\n//         /  \\   /  \\\n//        2   4  6    8\n//       /             \\\n//      1               9  -\u003e node inserted\n//\n\ntree.search(3); // BinaryTreeNode { _value: 3, ... }\n\ntree.remove(9);\n\n//              5  -\u003e root\n//            /   \\\n//           3     7\n//         /  \\   /  \\\n//        2   4  6    8\n//       /\n//      1                -\u003e node removed\n//\n\n// Use a custom comparator to determine tree hierarchy\n\n// string length (ascending) comparator\nlet tree = new BinaryTree([\"green\", \"red\", \"blue\"], (a, b) =\u003e a.length - b.length);\n\n//            \"blue\"  -\u003e root\n//           /     \\\n//        \"red\"  \"green\"\n//\n\ntree.findMax().value; // \"green\"\n```\n\n\u003cbr\u003e\n\n### [Heap](https://github.com/clarketm/super/tree/master/packages/Heap#readme)\n\n```js\nimport { Heap } from \"@clarketm/super\";\n\n// Max / Min (default) heap comparators\nlet { MAX, MIN } = Heap.HeapType;\n\nlet minHeap = new Heap([3, 7, 2, 5], MIN);\n\n//              2  -\u003e min\n//            /   \\\n//           5     3\n//          /\n//         7\n//\n\nminHeap.min; // 2\n\nminHeap.insert(8); // 5 : new size\n\n//              2  -\u003e min\n//            /   \\\n//           5     3\n//          /       \\\n//         7         8  -\u003e node inserted\n//\n\nlet min = minHeap.deleteMin(); // 2\n\n//              3  -\u003e min\n//            /   \\\n//           5     8\n//          /\n//         7\n//\n\nlet maxHeap = new Heap([3, 7, 2, 5], MAX);\n\n//              7  -\u003e max\n//            /   \\\n//           5     3\n//          /\n//         2\n//\n\nmaxHeap.max; // 7\n\nmaxHeap.isEmpty(); // false\n\nmaxHeap.clear();\nmaxHeap.size; // 0\n```\n\n\u003cbr\u003e\n\n### [LinkedList](https://github.com/clarketm/super/tree/master/packages/LinkedList#readme)\n\n```js\nimport { LinkedList } from \"@clarketm/super\";\n\nlet list = new LinkedList([1, 3, 5, 7]);\n\n//    1    \u003c-\u003e    3    \u003c-\u003e    5    \u003c-\u003e    7\n\nlist.size; // 4\nlist.head; // ListNode { _value: 1, ... }\nlist.tail; // ListNode { _value: 7, ... }\n\nlist.insert(1, 100);\n\n//         node inserted at pos: 1\n//                 ^\n//    1    \u003c-\u003e    100    \u003c-\u003e    3    \u003c-\u003e    5    \u003c-\u003e    7\n\nlist.append(99);\n\n//                                                          node inserted at tail\n//                                                                   ^\n//    1    \u003c-\u003e    100    \u003c-\u003e    3    \u003c-\u003e    5    \u003c-\u003e    7    \u003c-\u003e    99\n\nlist.remove(-1);\n\n//                                                          node removed from tail\n//                                                                   ^\n//    1    \u003c-\u003e    100    \u003c-\u003e    3    \u003c-\u003e    5    \u003c-\u003e    7\n\nlist.toArray(); // [ 1, 100, 3, 5, 7 ]\n```\n\n\u003cbr\u003e\n\n### [Map](https://github.com/clarketm/super/tree/master/packages/Map#readme)\n\n```js\nimport { Map } from \"@clarketm/super\";\n\nlet map = new Map([[\"a\", 1], [\"b\", 2], [\"c\", 3]]); // Map { 'a' =\u003e 1, 'b' =\u003e 2, 'c' =\u003e 3 }\n\n// Use any built-in Map methods:\nmap.get(\"c\"); // 3\n\n// Use custom methods (e.g. `setDefault`):\n// note: `setDefault` is similar to get(), but will set key to a defaultValue if the key is not in Map.\n\nlet item = map.setDefault(\"c\", 3);\nitem; // 3\nmap; // Map { 'a' =\u003e 1, 'b' =\u003e 2, 'c' =\u003e 3 }\n\nlet item = map.setDefault(\"d\", 4);\nitem; // 4\nmap; // Map { 'a' =\u003e 1, 'b' =\u003e 2, 'c' =\u003e 3 'd' =\u003e 4 }\n```\n\n\u003cbr\u003e\n\n### [Object](https://github.com/clarketm/super/tree/master/packages/Object#readme)\n\n```js\nimport { Object } from \"@clarketm/super\";\n\nlet object = new Object({ a: 1, b: true, c: 4 }); // Object { a: 1, b: true, c: 4 }\n\n// Use any built-in Object methods:\nObject.keys(object); // [ 'a', 'b', 'c' ]\n\n// Use custom methods (e.g. `clone`):\n// note: `clone` will create a deep copy of the object.\n\nlet clone = object.clone(); // Object { a: 1, b: true, c: 4 }\nObject.is(object, clone); // false\n```\n\n\u003cbr\u003e\n\n### [PriorityQueue](https://github.com/clarketm/super/tree/master/packages/PriorityQueue#readme)\n\n```js\nimport { PriorityQueue } from \"@clarketm/super\";\n\n// note: a PriorityQueue can be constructed from either a Map, Array of Arrays, Array of Objects, or Array w/ custom comparator.\n\n// Map\nlet pq = new PriorityQueue(new Map([[100, \"high\"], [0, \"low\"]]));\n\n// Array of Arrays\nlet pq = new PriorityQueue([[100, \"high\"], [0, \"low\"]]);\n\n// Array of Objects\nlet pq = new PriorityQueue([{ value: \"high\", priority: 100 }, { value: \"low\", priority: 0 }]);\n\n// Array w/ custom comparator\nlet pq = new PriorityQueue([\"high\", \"low\"], (a, b) =\u003e a.length \u003e b.length);\n\nlet pq = new PriorityQueue([[100, \"high\"], [50, \"medium\"], [0, \"low\"]]);\n\n//    highest priority              lowest priority\n//          ^                             ^\n//   |    \"high\"    |   \"medium\"   |    \"low\"    |\n//   |    (100)     |     (50)     |     (0)     |\n//\n\npq.size; // 3\npq.high; // QueueNode { _value: 'super high', _priority: 1000, ... }\npq.low; // QueueNode { _value: 'low', _priority: 0, ... }\n\npq.isEmpty(); // false\n\npq.insert(\"super high\", 1000); // 4 : new size\n\n//       highest priority                                lowest priority\n//             ^                                               ^\n//   |    \"super high\"    |    \"high\"    |   \"medium\"   |    \"low\"    |\n//   |       (1000)       |    (100)     |     (50)     |     (0)     |\n//\n\npq.deleteHigh(); // QueueNode { _value: 'super high', _priority: 1000, ... }\n\n//   highest priority               lowest priority\n//          ^                             ^\n//   |    \"high\"    |   \"medium\"   |    \"low\"    |\n//   |    (100)     |     (50)     |     (0)     |\n//\n\npq.deleteLow(); // QueueNode { _value: 'low', _priority: 0, ... }\n\n//  highest priority   lowest priority\n//          ^               ^\n//   |    \"high\"    |   \"medium\"   |\n//   |    (100)     |     (50)     |\n//\n\npq.clear();\npq.size; // 0\n```\n\n\u003cbr\u003e\n\n### [Queue](https://github.com/clarketm/super/tree/master/packages/Queue#readme)\n\n```js\nimport { Queue } from \"@clarketm/super\";\n\nlet queue = new Queue([2, 4, 6, 8]);\n\n//   front              rear\n//     ^                 ^\n//  |  2  |  4  |  6  |  8  |\n\nqueue.size; // 4\nqueue.front; // 2\nqueue.rear; // 8\n\nqueue.isEmpty(); // false\n\nqueue.enqueue(10); // 5 : new size\n\n//   front                   rear\n//     ^                      ^\n//  |  2  |  4  |  6  |  8  | 10 |\n\nqueue.dequeue(); // 2  : dequeued item\n\n//   front              rear\n//     ^                 ^\n//  |  4  |  6  |  8  | 10 |\n\nqueue.clear();\nqueue.size; // 0\n```\n\n\u003cbr\u003e\n\n### [Set](https://github.com/clarketm/super/tree/master/packages/Set#readme)\n\n```js\nimport { Set } from \"@clarketm/super\";\n\nlet setA = new Set([1, 2, 3]); // Set { 1, 2, 3 }\nlet setB = new Set([2, 3, 4]); // Set { 2, 3, 4 }\n\n// Use any built-in Set methods:\nsetA.has(1); // true\n\n// Use custom methods:\n\n// `isSubset`\nsetA.isSubset(setB); // false\n\n// `isSuperset`\nsetA.isSuperset(setB); // false\n\n// `isDisjoint`\nsetA.isDisjoint(setB); // false\n\n// `union`\nsetA.union(setB); // Set { 1, 2, 3, 4 }\n\n// `intersection`\nsetA.intersection(setB); // Set { 2, 3 }\n\n// `difference`\nsetA.difference(setB); // Set { 1 }\n\n// `symmetricDifference`\nsetA.symmetricDifference(setB); // Set { 1, 4 }\n```\n\n\u003cbr\u003e\n\n### [Trie](https://github.com/clarketm/super/tree/master/packages/Trie#readme)\n\n```js\nimport { Trie } from \"@clarketm/super\";\n\nlet trie = new Trie([\"me\", \"men\", \"go\"]);\n\n//               root\n//              /   \\\n//            'm'    'g'\n//           /         \\\n//    $ \u003c- 'e'         'o' -\u003e $\n//         /\n//  $ \u003c- 'n'\n//\n// $: denotes a complete word\n//\n\ntrie.root; // TrieNode { _char: √, ... }\n\ntrie.insert(\"met\");\n\n//               root\n//              /   \\\n//            'm'    'g'\n//           /         \\\n//    $ \u003c- 'e'         'o' -\u003e $\n//         /  \\\n//  $ \u003c- 'n'   't' -\u003e $\n//\n// $: denotes a complete word\n//\n\n// `word` search w/ `contains`\ntrie.contains(\"me\"); // true\n\n// `prefix` search w/ `startsWith`\ntrie.startsWith(\"m\"); // true\n\n// Return a full Match object w/ `search`\ntrie.search(\"men\");\n\n// Match object\n// {\n//  query: 'men',\n//  matchedChars: 3,\n//  isMatch: true,\n//  isCompleteWord: true,\n//  node: TrieNode { ... }\n// }\n\ntrie.remove(\"go\");\n\n//               root\n//              /\n//            'm'\n//           /\n//    $ \u003c- 'e'\n//         /  \\\n//  $ \u003c- 'n'   't' -\u003e $\n//\n// $: denotes a complete word\n//\n```\n\n\u003cbr\u003e\n\n## Data Types\n\n### [Number](https://github.com/clarketm/super/tree/master/packages/Number#readme)\n\n### [Math](https://github.com/clarketm/super/tree/master/packages/Math#readme)\n\n### [String](https://github.com/clarketm/super/tree/master/packages/String#readme)\n\n\u003cbr\u003e\n\n## Sorting Algorithms\n\n### [BubbleSort](https://github.com/clarketm/super/tree/master/packages/BubbleSort#readme)\n\n```js\nimport { bubbleSort } from \"@clarketm/super\";\n\n// General usage\n\n// ascending\nlet sortedArray = bubbleSort([4, 3, 8, 1]); // [1, 3, 4, 8]\n\n// Custom comparator\n\n// descending\nlet sortedArray = bubbleSort([4, 3, 8, 1], (a, b) =\u003e b - a); // [8, 4, 3, 1]\n\n// ascending (string length)\nlet sortedArray = bubbleSort([\"111\", \"1\", \"11\"], (a, b) =\u003e a.length - b.length); // [\"1\", \"11\", \"111\"]\n\n// descending (string length)\nlet sortedArray = bubbleSort([\"111\", \"1\", \"11\"], (a, b) =\u003e b.length - a.length); // [\"111\", \"11\", \"1\"]\n```\n\n### [InsertionSort](https://github.com/clarketm/super/tree/master/packages/InsertionSort#readme)\n\n```js\nimport { insertionSort } from \"@clarketm/super\";\n\n// General usage\n\n// ascending\nlet sortedArray = insertionSort([4, 3, 8, 1]); // [1, 3, 4, 8]\n\n// Custom comparator\n\n// descending\nlet sortedArray = insertionSort([4, 3, 8, 1], (a, b) =\u003e b - a); // [8, 4, 3, 1]\n\n// ascending (string length)\nlet sortedArray = insertionSort([\"111\", \"1\", \"11\"], (a, b) =\u003e a.length - b.length); // [\"1\", \"11\", \"111\"]\n\n// descending (string length)\nlet sortedArray = insertionSort([\"111\", \"1\", \"11\"], (a, b) =\u003e b.length - a.length); // [\"111\", \"11\", \"1\"]\n```\n\n### [MergeSort](https://github.com/clarketm/super/tree/master/packages/MergeSort#readme)\n\n```js\nimport { mergeSort } from \"@clarketm/super\";\n\n// General usage\n\n// ascending\nlet sortedArray = mergeSort([4, 3, 8, 1]); // [1, 3, 4, 8]\n\n// Custom comparator\n\n// descending\nlet sortedArray = mergeSort([4, 3, 8, 1], (a, b) =\u003e b - a); // [8, 4, 3, 1]\n\n// ascending (string length)\nlet sortedArray = mergeSort([\"111\", \"1\", \"11\"], (a, b) =\u003e a.length - b.length); // [\"1\", \"11\", \"111\"]\n\n// descending (string length)\nlet sortedArray = mergeSort([\"111\", \"1\", \"11\"], (a, b) =\u003e b.length - a.length); // [\"111\", \"11\", \"1\"]\n```\n\n### [QuickSort](https://github.com/clarketm/super/tree/master/packages/QuickSort#readme)\n\n```js\nimport { quickSort } from \"@clarketm/super\";\n\n// General usage\n\n// ascending\nlet sortedArray = quickSort([4, 3, 8, 1]); // [1, 3, 4, 8]\n\n// Custom comparator\n\n// descending\nlet sortedArray = quickSort([4, 3, 8, 1], (a, b) =\u003e b - a); // [8, 4, 3, 1]\n\n// ascending (string length)\nlet sortedArray = quickSort([\"111\", \"1\", \"11\"], (a, b) =\u003e a.length - b.length); // [\"1\", \"11\", \"111\"]\n\n// descending (string length)\nlet sortedArray = quickSort([\"111\", \"1\", \"11\"], (a, b) =\u003e b.length - a.length); // [\"111\", \"11\", \"1\"]\n```\n\n### [SelectionSort](https://github.com/clarketm/super/tree/master/packages/SelectionSort#readme)\n\n```js\nimport { selectionSort } from \"@clarketm/super\";\n\n// General usage\n\n// ascending\nlet sortedArray = selectionSort([4, 3, 8, 1]); // [1, 3, 4, 8]\n\n// Custom comparator\n\n// descending\nlet sortedArray = selectionSort([4, 3, 8, 1], (a, b) =\u003e b - a); // [8, 4, 3, 1]\n\n// ascending (string length)\nlet sortedArray = selectionSort([\"111\", \"1\", \"11\"], (a, b) =\u003e a.length - b.length); // [\"1\", \"11\", \"111\"]\n\n// descending (string length)\nlet sortedArray = selectionSort([\"111\", \"1\", \"11\"], (a, b) =\u003e b.length - a.length); // [\"111\", \"11\", \"1\"]\n```\n\n## License\n\nMIT \u0026copy; [**Travis Clarke**](https://blog.travismclarke.com/)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclarketm%2Fsuper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclarketm%2Fsuper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclarketm%2Fsuper/lists"}