diff --git a/.editorconfig b/.editorconfig index dec6b5b..4c3931a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,7 +8,8 @@ root = true [*] -indent_style = tab +indent_style = space +indent_size = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true diff --git a/.github/code-of-conduct.md b/.github/code-of-conduct.md new file mode 100644 index 0000000..f809c8b --- /dev/null +++ b/.github/code-of-conduct.md @@ -0,0 +1,40 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/.github/contributing.md b/.github/contributing.md new file mode 100644 index 0000000..d8d5c29 --- /dev/null +++ b/.github/contributing.md @@ -0,0 +1,103 @@ +## Contributing + +> Please note that this project is released with a [Contributor Code of Conduct](code-of-conduct.md). By participating in this project you agree to abide by its terms. + +## See + +- [General Rules](#general-rules) +- [All ▲lgorithms Structure](#all-lgorithms-python-library-structure) +- [Adding new algorithms](#adding-new-algorithms) +- [Style](#style) +- [Adding Documentation](#adding-documentation) + +### General Rules + +- As much as possible, try to follow the existing format of markdown and code. + +### All ▲lgorithms Python Library Structure + +- Directories and files are all in lower case letter. +- Files are separated by an underscore (`_`) following the `snake_case` style. +- Directories in documentation are separated by a minus or hyphen (`-`) following `kebeab-case` style. + +> We follow this structure + +``` +├── allalgorithms +│ │── sorting +| | │── bubble_sort.py +| | └── merge_sort.py +│ └── searches +| │── binary_search.py +| └── linear_search.py +├── docs +│ │── sorting +| | │── bubble-sort.md +| | └── merge-sort.md +│ └── searches +| │── binary-search.md +| └── linear-search.md +└── tests + │── test_searches.py + └── test_sorting.py +``` + +### Adding new algorithms + +- Make your pull requests to be **specific** and **focused**. Instead of contributing "several algorithms" all at once contribute them all one by one separately (i.e. one pull request for "Binary Search", another one +for "Bubble Sort" and so on). +- Describe what you do in code using **comments**. + +### Style + +
Please DO NOT EDIT CHANGELOG on your pull requests, this is must be edited by one of the write access maintainers when they going to drop a new release.
+ +This repository follow the [PEP8 Style Gide for Python](https://www.python.org/dev/peps/pep-0008/), so make sure you lint your code before adding a new pull request. + +Each `.py` file should have the following header. (no for testing files) + +```py +# -*- coding: UTF-8 -*- +# +# Binary search works for a sorted array. +# The All ▲lgorithms library for python +# +# Contributed by: Carlos Abraham Hernandez +# Github: @abranhe +# +``` + +If the algorithm is modified, this should be included there also. + +```py +# Contributed by: Carlos Abraham Hernandez +# Github: @abranhe +# +# Modified by: Your Name +# Github: @yourgithubusername +``` + +If the algorithm have been modified by multiple contributors, that should be included as follow. + +```py +# Contributed by: Carlos Abraham Hernandez +# Github: @abranhe +# +# Modifiers: +# Your Name, @yourgithubusername +# Your friend's name, @yourfriendongithub +``` + +### Adding Documentation + +Please make sure if you add an algorithm, you also add the required +documentation for it the `/docs` directory. + +Follow some of the examples already added. + +If you are modifying an algorithm make sure you add a benchmark using [Repl.it](https://repl.it/) for the maintainers to have it easy to review it. + + +#### Lastly and not less important: + +Make sure you start ⭐️ the project and follow [@abranhe](https://git.io/abranhe) diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 0000000..9bfede2 --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,21 @@ + + +This issue is: + + + +- [ ] A new Algorithm +- [ ] An update to an existing algorithm. +- [ ] An error found +- [ ] A proposal +- [ ] A question +- [ ] Other (Describe below*) + +**Description:** + + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..b85077b --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,23 @@ + + +This pull request is: + + + +- [ ] A new Algorithm +- [ ] An update to an existing algorithm. +- [ ] An error fix +- [ ] Other (Describe below*) + +This pull request fixes: + + + +**Changes:** + + diff --git a/allalgorithms/.editorconfig b/allalgorithms/.editorconfig index 4d5a7f0..3e4ba08 100644 --- a/allalgorithms/.editorconfig +++ b/allalgorithms/.editorconfig @@ -7,7 +7,8 @@ root = true [*] -indent_style = tab +indent_style = space +indent_size = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true diff --git a/allalgorithms/numeric/__init__.py b/allalgorithms/numeric/__init__.py new file mode 100644 index 0000000..cd1f5cc --- /dev/null +++ b/allalgorithms/numeric/__init__.py @@ -0,0 +1 @@ +from .max_numbers import find_max \ No newline at end of file diff --git a/allalgorithms/numeric/max_numbers.py b/allalgorithms/numeric/max_numbers.py new file mode 100644 index 0000000..122734a --- /dev/null +++ b/allalgorithms/numeric/max_numbers.py @@ -0,0 +1,16 @@ +# -*- coding: UTF-8 -*- +# +# Numeric Algorithms +# The All ▲lgorithms library for python +# +# Contributed by: Becky +# Github: @beckyw5 +# + + +def find_max (L): + max = 0 + for x in L: + if x > max: + max = x + return max diff --git a/allalgorithms/searches/__init__.py b/allalgorithms/searches/__init__.py index dad7119..1f1caa6 100644 --- a/allalgorithms/searches/__init__.py +++ b/allalgorithms/searches/__init__.py @@ -1 +1,3 @@ from .binary_search import * +from .fibonacci_search import * +from .jump_search import * diff --git a/allalgorithms/searches/fibonacci_search.py b/allalgorithms/searches/fibonacci_search.py new file mode 100644 index 0000000..0d9aa01 --- /dev/null +++ b/allalgorithms/searches/fibonacci_search.py @@ -0,0 +1,35 @@ +# -*- coding: UTF-8 -*- +# +# Fibonacci search works for a sorted array. +# The All ▲lgorithms library for python +# +# Contributed by: dieterpl +# Github: @dieterpl +# + + +def fibonacci_search(arr, query): + fib2, fib1 = 0, 1 + fib = fib2 + fib1 + hi = len(arr) - 1 + while fib <= hi: + fib2 = fib1 + fib1 = fib + fib = fib2 + fib1 + offset = -1 + while fib > 1: + i = min(offset + fib2, hi) + if arr[i] < query: + fib = fib1 + fib1 = fib2 + fib2 = fib - fib1 + offset = i + elif arr[i] > query: + fib = fib2 + fib1 = fib1 - fib2 + fib2 = fib - fib1 + else: + return i + if fib1 and arr[offset + 1] == query: + return offset + 1 + return None diff --git a/allalgorithms/searches/jump_search.py b/allalgorithms/searches/jump_search.py new file mode 100644 index 0000000..39a0cc0 --- /dev/null +++ b/allalgorithms/searches/jump_search.py @@ -0,0 +1,25 @@ +# -*- coding: UTF-8 -*- +# +# Jump search works for a sorted array. +# The All ▲lgorithms library for python +# +# Contributed by: pieromoto +# Github: @pieromoto +# +import math + +def jump_search( arr, query): + arr_len = len(arr) + prev = 0 + step = int(math.sqrt(arr_len)) + + for i in range(step-1, arr_len, step): + if(arr[i] >= query): + break + prev = i + + for j in range(prev, arr_len): + if(arr[j] == query): + return j + + return None \ No newline at end of file diff --git a/allalgorithms/sorting/__init__.py b/allalgorithms/sorting/__init__.py index d84d4f4..9d4d453 100644 --- a/allalgorithms/sorting/__init__.py +++ b/allalgorithms/sorting/__init__.py @@ -2,3 +2,8 @@ from .insertion_sort import insertion_sort from .selection_sort import selection_sort from .bubble_sort import bubble_sort +from .pigeonhole_sort import pigeonhole_sort +from .stooge_sort import stooge_sort +from .cocktail_shaker_sort import cocktail_shaker_sort +from .tree_sort import tree_sort +from .heap_sort import heap_sort diff --git a/allalgorithms/sorting/cocktail_shaker_sort.py b/allalgorithms/sorting/cocktail_shaker_sort.py new file mode 100644 index 0000000..1a0252f --- /dev/null +++ b/allalgorithms/sorting/cocktail_shaker_sort.py @@ -0,0 +1,30 @@ +# -*- coding: UTF-8 -*- +# +# Cocktail Shaker Sort Algorithm +# The All ▲lgorithms library for python +# +# Contributed by: Martmists +# Github: @martmists +# + + +def cocktail_shaker_sort(data): + upper = len(data) - 1 + lower = 0 + + no_swap = False + while upper - lower > 1 and not no_swap: + no_swap = True + for j in range(lower, upper): + if data[j + 1] < data[j]: + data[j + 1], data[j] = data[j], data[j + 1] + no_swap = False + upper = upper - 1 + + for j in range(upper, lower, -1): + if data[j - 1] > data[j]: + data[j - 1], data[j] = data[j], data[j - 1] + no_swap = False + lower = lower + 1 + + return data diff --git a/allalgorithms/sorting/heap_sort.py b/allalgorithms/sorting/heap_sort.py new file mode 100644 index 0000000..a5b9e34 --- /dev/null +++ b/allalgorithms/sorting/heap_sort.py @@ -0,0 +1,48 @@ +# -*- coding: UTF-8 -*- +# +# Heap Sort Algorithm +# The All ▲lgorithms library for python +# +# Contributed by: DatHydroGuy +# Github: @DatHydroGuy +# + + +def build_heap(array_to_sort, array_length, index): + """ + Build a heap, where each node has two child nodes, and a root node is greater than both child nodes. + """ + largest = index # Flag the largest element as the last (root) element + left = 2 * index + 1 # Calculate index of left child node + right = 2 * index + 2 # Calculate index of right child node + + # See if left child of root exists and is greater than root + if left < array_length and array_to_sort[index] < array_to_sort[left]: + largest = left + + # See if right child of root exists and is greater than root + if right < array_length and array_to_sort[largest] < array_to_sort[right]: + largest = right + + # If a larger element than root was found, swap with root so that root holds the new largest value + if largest != index: + array_to_sort[index], array_to_sort[largest] = array_to_sort[largest], array_to_sort[index] # swap + + # Re-build the heap under the new largest root node + build_heap(array_to_sort, array_length, largest) + + +def heap_sort(array_to_sort): + """ + Builds a max-heap, then continuously removes the largest element and re-builds the heap until sorted + """ + array_length = len(array_to_sort) + + # Build a max-heap to sort the elements into order + for index in range(array_length // 2 - 1, -1, -1): + build_heap(array_to_sort, array_length, index) + + # One by one extract elements + for index in range(array_length - 1, 0, -1): + array_to_sort[index], array_to_sort[0] = array_to_sort[0], array_to_sort[index] # swap + build_heap(array_to_sort, index, 0) diff --git a/allalgorithms/sorting/pigeonhole_sort.py b/allalgorithms/sorting/pigeonhole_sort.py new file mode 100644 index 0000000..c7ce64f --- /dev/null +++ b/allalgorithms/sorting/pigeonhole_sort.py @@ -0,0 +1,22 @@ +# -*- coding: UTF-8 -*- +# +# Pigeonhole Sort Algorithm +# The All ▲lgorithms library for python +# +# Contributed by: Martmists +# Github: @martmists +# + +def pigeonhole_sort(data): + minimum = min(data) + size = max(data) - minimum + 1 + holes = [0] * size + for item in data: + holes[item - minimum] += 1 + i = 0 + for count in range(size): + while holes[count] > 0: + holes[count] -= 1 + data[i] = count + minimum + i += 1 + return data diff --git a/allalgorithms/sorting/quicksort.py b/allalgorithms/sorting/quicksort.py new file mode 100644 index 0000000..6990462 --- /dev/null +++ b/allalgorithms/sorting/quicksort.py @@ -0,0 +1,29 @@ +# -*- coding: UTF-8 -*- +# +# Quick Sort Algorithm +# The All ▲lgorithms library for python +# +# Contributed by: Brian D. Hopper +# Github: @bubbabeans +# +def partition(xs, start, end): + follower = leader = start + while leader < end: + if xs[leader] <= xs[end]: + xs[follower], xs[leader] = xs[leader], xs[follower] + follower += 1 + leader += 1 + xs[follower], xs[end] = xs[end], xs[follower] + return follower + +def _quicksort(xs, start, end): + if start >= end: + return + p = partition(xs, start, end) + _quicksort(xs, start, p-1) + _quicksort(xs, p+1, end) + +def quicksort(xs): + _quicksort(xs, 0, len(xs)-1) + +# To use: create a list and send it to quicksort: quicksort(list placed here) diff --git a/allalgorithms/sorting/shell_sort.py b/allalgorithms/sorting/shell_sort.py new file mode 100644 index 0000000..b415af8 --- /dev/null +++ b/allalgorithms/sorting/shell_sort.py @@ -0,0 +1,30 @@ +# -*- coding: UTF-8 -*- +# +# Shell Sort Algorithm +# The All ▲lgorithms library for python +# +# Contributed by: Elias +# Github: @eliasbayona +# + +def shell_sort(arr): + n = len(arr) + h = int(n/2) + + + while h > 0: + for i in range(h,n): + + temp = arr[i] + j = i + + while j >= h and arr[j-h] >temp: + arr[j] = arr[j-h] + j -= h + + arr[j] = temp + + h = int(h/2) + + return arr + diff --git a/allalgorithms/sorting/stooge_sort.py b/allalgorithms/sorting/stooge_sort.py new file mode 100644 index 0000000..499f8e6 --- /dev/null +++ b/allalgorithms/sorting/stooge_sort.py @@ -0,0 +1,21 @@ +# -*- coding: UTF-8 -*- +# +# Stooge Sort Algorithm +# The All ▲lgorithms library for python +# +# Contributed by: Martmists +# Github: @martmists +# + + +def stooge_sort(seq, start=0, end=None): + if end is None: + end = len(seq) - 1 + if seq[start] > seq[end]: + seq[start], seq[end] = seq[end], seq[start] + if (end - start + 1) > 2: + third = (end - start + 1) // 3 + stooge_sort(seq, start, end-third) + stooge_sort(seq, start+third, end) + stooge_sort(seq, start, end-third) + return seq diff --git a/allalgorithms/sorting/tree_sort.py b/allalgorithms/sorting/tree_sort.py new file mode 100644 index 0000000..341c305 --- /dev/null +++ b/allalgorithms/sorting/tree_sort.py @@ -0,0 +1,48 @@ +class BinaryTreeNode(object): + #initial values for value,left and right + def __init__(self, value): + self.value = value + self.left = None + self.right = None + + +# inserting a new node in the binary tree +def insert(tree, item): + # if no initial element in the tree + if tree == None: + tree = BinaryTreeNode(item) + else: + if (item < tree.value): + # if left branch of the tree is empty + if (tree.left == None): + tree.left = BinaryTreeNode(item) + else: + insert(tree.left, item) + else: + # if right branch of the tree is empty + if (tree.right == None): + tree.right = BinaryTreeNode(item) + else: + insert(tree.right, item) + return tree + +# funtion for the inorder traversal of the binary tree +def in_order_traversal(tree,a): + if (tree.left != None): + in_order_traversal(tree.left,a) + a.append(tree.value) + if (tree.right != None): + in_order_traversal(tree.right,a) + + +def tree_sort(x): + # root node + t = insert(None, x[0]); + # inserting all elements in the binary tree + for i in x[1:]: + insert(t,i) + # the results of the inorder traversal of a binary tree is a sorted + a = [] + in_order_traversal(t,a) + return a + diff --git a/allalgorithms/string/__init__.py b/allalgorithms/string/__init__.py new file mode 100644 index 0000000..dd8aa8f --- /dev/null +++ b/allalgorithms/string/__init__.py @@ -0,0 +1,3 @@ +from .palindrome_check import * +from .is_unique import * +from .hamming_dist import * diff --git a/allalgorithms/string/hamming_dist.py b/allalgorithms/string/hamming_dist.py new file mode 100644 index 0000000..c2811e1 --- /dev/null +++ b/allalgorithms/string/hamming_dist.py @@ -0,0 +1,14 @@ +# -*- coding: UTF-8 -*- +# +# Binary search works for a sorted array. +# The All ▲lgorithms library for python +# +# Contributed by: ninexball +# Github: @ninexball +# + +def hamming_dist(seq1: str, seq2: str) -> int: + """Compare hamming distance of two strings""" + if len(seq1) != len(seq2): + raise ValueError("length of strings are not the same") + return sum(c1 != c2 for c1, c2 in zip(seq1, seq2)) diff --git a/allalgorithms/string/is_unique.py b/allalgorithms/string/is_unique.py new file mode 100644 index 0000000..986a30c --- /dev/null +++ b/allalgorithms/string/is_unique.py @@ -0,0 +1,16 @@ +# -*- coding: UTF-8 -*- +# +# Check if a string has all unique characters. +# The All ▲lgorithms library for python +# +# Contributed by: José E. Andrade Jr. +# Github: @andradejunior +# + +def is_unique(string_to_check): + character_set = set() + for character in string_to_check: + if character in character_set: + return False + character_set.add(character) + return True diff --git a/allalgorithms/string/palindrome_check.py b/allalgorithms/string/palindrome_check.py new file mode 100644 index 0000000..a9a5991 --- /dev/null +++ b/allalgorithms/string/palindrome_check.py @@ -0,0 +1,17 @@ +# -*- coding: UTF-8 -*- +# +# Checks if string is a palindrome +# The All ▲lgorithms library for python +# +# Contributed by: dieterpl +# Github: @dieterpl +# +import re + +def palindrome_check(s): + s = re.sub(r'[^\w]', '', s) + if len(s) < 2: + return True + if s[0].lower() != s[-1].lower(): + return False + return palindrome_check(s[1:-1]) diff --git a/changelog.md b/changelog.md index 558ec82..a46e7e3 100644 --- a/changelog.md +++ b/changelog.md @@ -1,14 +1,41 @@@@ -29,9 +29,11 @@ - Why not 😂 - Clean and focused - Actively maintained -- Because All Algorithms should easy to use in Python +- Because All Algorithms should be easy to use in Python -Read the detailed documentation at [python.allalgorithms.com](https://python.allalgorithms.com) or see [Tree](#tree). +Read the detailed documentation at [python.allalgorithms.com](https://python.allalgorithms.com) or see the [`docs`](https://github.com/abranhe/allalgorithms-python/blob/master/docs) directory on Github. See [Tree](#tree). + +**Want to contribute?** [GET STARTED HERE](https://github.com/abranhe/allalgorithms-python/tree/master/.github/contributing.md) ## Install @@ -55,15 +57,25 @@ print(binary_search(arr, 3)) # Tree -- Searches - - [Binary Search](searches/binary-search) -- Sorting - - [Merge Sort](sorting/merge-sort) - +- ### Searches + - [Binary Search](https://python.allalgorithms.com/searches/binary-search) + - [Fibonacci Search](https://python.allalgorithms.com/searches/fibonacci-search) + - [Jump Search](https://python.allalgorithms.com/searches/jump-search) + +- ### Sorting + - [Bubble Sort](https://python.allalgorithms.com/sorting/bubble-sort) + - [Cocktail Shaker Sort](https://python.allalgorithms.com/sorting/cocktail-shaker-sort) + - [Insertion Sort](https://python.allalgorithms.com/sorting/insertion-sort) + - [Merge Sort](https://python.allalgorithms.com/sorting/merge-sort) + - [Pigeonhole Sort](https://python.allalgorithms.com/sorting/pigeonhole-sort) + - [Selection Sort](https://python.allalgorithms.com/sorting/selection-sort) + - [Stooge Sort](https://python.allalgorithms.com/sorting/stooge-sort) +- ### String + - [Palindrome Check](https://python.allalgorithms.com/string/palindrom-check) # Related -- [javascript-lib](https://github.com/abranhe/javascript-lib): All ▲lgorithms Javascript library +- [allalgorithms-javascript](https://github.com/abranhe/allalgorithms-javascript): All ▲lgorithms Javascript library # Maintainers @@ -78,10 +90,10 @@ print(binary_search(arr, 3)) [1]: https://cdn.abranhe.com/projects/algorithms/badge.svg -[2]: https://github.com/abranhe/python-lib +[2]: https://github.com/abranhe/allalgorithms-python [3]: https://avatars3.githubusercontent.com/u/21347264?s=50 [4]: https://github.com/abranhe -[5]: https://github.com/abranhe/python-lib/blob/master/LICENSE +[5]: https://github.com/abranhe/allalgorithms-python/blob/master/license
@@ -31,7 +31,9 @@ - Actively maintained - Because All Algorithms should be easy to use in Python -Read the detailed documentation at [python.allalgorithms.com](https://python.allalgorithms.com) or see the [`docs`](https://github.com/abranhe/python-lib/blob/master/docs) directory on Github. See [Tree](#tree). +Read the detailed documentation at [python.allalgorithms.com](https://python.allalgorithms.com) or see the [`docs`](https://github.com/abranhe/allalgorithms-python/blob/master/docs) directory on Github. See [Tree](#tree). + +**Want to contribute?** [GET STARTED HERE](https://github.com/abranhe/allalgorithms-python/tree/master/.github/contributing.md) ## Install @@ -55,15 +57,25 @@ print(binary_search(arr, 3)) # Tree -- Searches +- ### Searches - [Binary Search](https://python.allalgorithms.com/searches/binary-search) -- Sorting - - [Merge Sort](https://python.allalgorithms.com/sorting/merge-sort) - + - [Fibonacci Search](https://python.allalgorithms.com/searches/fibonacci-search) + - [Jump Search](https://python.allalgorithms.com/searches/jump-search) + +- ### Sorting + - [Bubble Sort](https://python.allalgorithms.com/sorting/bubble-sort) + - [Cocktail Shaker Sort](https://python.allalgorithms.com/sorting/cocktail-shaker-sort) + - [Insertion Sort](https://python.allalgorithms.com/sorting/insertion-sort) + - [Merge Sort](https://python.allalgorithms.com/sorting/merge-sort) + - [Pigeonhole Sort](https://python.allalgorithms.com/sorting/pigeonhole-sort) + - [Selection Sort](https://python.allalgorithms.com/sorting/selection-sort) + - [Stooge Sort](https://python.allalgorithms.com/sorting/stooge-sort) +- ### String + - [Palindrome Check](https://python.allalgorithms.com/string/palindrom-check) # Related -- [javascript-lib](https://github.com/abranhe/javascript-lib): All ▲lgorithms Javascript library +- [allalgorithms-js](https://github.com/abranhe/allalgorithms-js): All ▲lgorithms Javascript library # Maintainers @@ -78,10 +90,10 @@ print(binary_search(arr, 3)) [1]: https://cdn.abranhe.com/projects/algorithms/badge.svg -[2]: https://github.com/abranhe/python-lib +[2]: https://github.com/abranhe/allalgorithms-python [3]: https://avatars3.githubusercontent.com/u/21347264?s=50 [4]: https://github.com/abranhe -[5]: https://github.com/abranhe/python-lib/blob/master/LICENSE +[5]: https://github.com/abranhe/allalgorithms-python/blob/master/license