From 3ae40ff10b21f2bfde82569a5cbd9845db3ec0ae Mon Sep 17 00:00:00 2001 From: Muhammad Awais Date: Sun, 5 Feb 2023 16:06:48 +0500 Subject: [PATCH] Feat: Added bucket sort --- sorts/bucket_sort.ts | 37 ++++++++++++++++++++++++++++++++++ sorts/test/bucket_sort.test.ts | 21 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 sorts/bucket_sort.ts create mode 100644 sorts/test/bucket_sort.test.ts diff --git a/sorts/bucket_sort.ts b/sorts/bucket_sort.ts new file mode 100644 index 00000000..ed5753f8 --- /dev/null +++ b/sorts/bucket_sort.ts @@ -0,0 +1,37 @@ +/** + * @function bucketSort + * @description Bucket sort is a sorting algorithm that works by distributing the elements of an array into a number of buckets. + * Each bucket is then sorted either using a different sorting algorithm, or by recursively applying the bucket sorting algorithm. + * @complexity_analysis + * Space Complexity - O(n + k) + * Time Complexity - O(n + k) + * @param {number[]} arr - The array to be sorted. + * @returns {number[]} - The sorted array. + * @see https://en.wikipedia.org/wiki/Bucket_sort + * @example bucketSort([5, 4, 3, 2, 1]) // [1, 2, 3, 4, 5] + */ + +import { insertionSort } from "./insertion_sort"; + +export function bucketSort(arr: number[]): number[] { + const buckets: number[][] = []; + const sortedArray: number[] = []; + + for (let i = 0; i < arr.length; i++) { + const bucketIndex = Math.floor(arr[i] / 10); + if (buckets[bucketIndex]) { + buckets[bucketIndex].push(arr[i]); + } else { + buckets[bucketIndex] = [arr[i]]; + } + } + + for (let i = 0; i < buckets.length; i++) { + if (buckets[i]) { + insertionSort(buckets[i]); + sortedArray.push(...buckets[i]); + } + } + + return sortedArray; +} diff --git a/sorts/test/bucket_sort.test.ts b/sorts/test/bucket_sort.test.ts new file mode 100644 index 00000000..fa70e920 --- /dev/null +++ b/sorts/test/bucket_sort.test.ts @@ -0,0 +1,21 @@ +import { bucketSort } from "../bucket_sort"; + +describe("Testing Bucket sort", () => { + const testCases: number[][] = []; + + for (let i = 0; i < 10; i++) { + const arr = []; + for (let j = 0; j < 100; j++) { + arr.push(Math.floor(Math.random() * 100)); + } + testCases.push(arr); + } + test.each(testCases)( + "should return the correct value for test case: %#", + (...arr: number[]) => { + expect(bucketSort([...arr])).toStrictEqual( + [...arr].sort((a: number, b: number) => a - b) + ); + } + ); +});