diff --git a/Data Structures and Algorithms/Sorting Algorithms/Cycle_Sort.py b/Data Structures and Algorithms/Sorting Algorithms/Cycle_Sort.py new file mode 100644 index 00000000..1afd985f --- /dev/null +++ b/Data Structures and Algorithms/Sorting Algorithms/Cycle_Sort.py @@ -0,0 +1,50 @@ +from typing import List + +def cycle_sort(nums: List[int]) -> int: + + writes = 0 + + for cycle_start in range(len(nums) - 1): + current = nums[cycle_start] + + # Find the target position for the current item. + target_position = cycle_start + for i in range(cycle_start + 1, len(nums)): + if nums[i] < current: + target_position += 1 + + # Skip if the item is already in the correct position. + if target_position == cycle_start: + continue + + # Handle duplicates by finding the next available position. + while current == nums[target_position]: + target_position += 1 + + nums[target_position], current = current, nums[target_position] + writes += 1 + + # Rotate the rest of the cycle. + while target_position != cycle_start: + target_position = cycle_start + for i in range(cycle_start + 1, len(nums)): + if nums[i] < current: + target_position += 1 + + while current == nums[target_position]: + target_position += 1 + + nums[target_position], current = current, nums[target_position] + writes += 1 + + return writes + + +if __name__ == "__main__": + arr = [1, 8, 3, 9, 10, 10, 2, 4] + print("Before sort:", arr) + + writes = cycle_sort(arr) + + print("After sort:", arr) + print(f"Number of writes: {writes}") diff --git a/Data Structures and Algorithms/Sorting Algorithms/Pigeonhole_Sort.py b/Data Structures and Algorithms/Sorting Algorithms/Pigeonhole_Sort.py new file mode 100644 index 00000000..11a60934 --- /dev/null +++ b/Data Structures and Algorithms/Sorting Algorithms/Pigeonhole_Sort.py @@ -0,0 +1,33 @@ +# Python program to implement Pigeonhole Sort + +def pigeonhole_sort(a): + # size of range of values in the list + # (ie, number of pigeonholes we need) + my_min = min(a) + my_max = max(a) + size = my_max - my_min + 1 + + # our list of pigeonholes + holes = [0] * size + + # Populate the pigeonholes. + for x in a: + assert type(x) is int, "integers only" + holes[x - my_min] += 1 + + # Put the elements back into the array in order. + i = 0 + for count in range(size): + while holes[count] > 0: + holes[count] -= 1 + a[i] = count + my_min + i += 1 + + +a = [8, 1, 2, 7, 4, 5, 8] +print("Sorted order is : ", end = ' ') + +pigeonhole_sort(a) + +for i in range(0, len(a)): + print(a[i], end = ' ') diff --git a/Data Structures and Algorithms/Sorting Algorithms/README.md b/Data Structures and Algorithms/Sorting Algorithms/README.md new file mode 100644 index 00000000..7ddfda4b --- /dev/null +++ b/Data Structures and Algorithms/Sorting Algorithms/README.md @@ -0,0 +1,49 @@ +# Cycle Sort Algorithm + +## Overview +Cycle Sort is a comparison-based sorting algorithm that is efficient when minimizing memory writes is important. It is an in-place sorting algorithm that rearranges the elements by identifying cycles in the permutation of elements. + +## Algorithm Explanation +The algorithm works by: +1. Identifying the correct position of each element in the array. +2. Placing the element in its correct position and replacing the element already there in the cycle. +3. Repeating the process for the remaining unsorted elements. + +## Complexity +- **Time Complexity**: + - Best, Worst, and Average Case: O(n²) (due to nested cycles). +- **Space Complexity**: O(1) (in-place sorting). + +## Usage Example +```python +from Cycle_Sort import cycle_sort + +arr = [4, 5, 3, 2, 1] +print("Original array:", arr) +writes = cycle_sort(arr) +print("Sorted array:", arr) +print("Number of writes performed:", writes) +``` +# Pigeonhole Sort Algorithm + +## Overview +Pigeonhole Sort is a sorting algorithm that works well for sorting lists where the range of values (i.e., the difference between the maximum and minimum values) is not significantly larger than the number of elements in the list. It is a non-comparison-based sorting algorithm. + +The algorithm works by placing each element into its corresponding "pigeonhole" (a slot or bucket) and then iterating through the pigeonholes in order to reconstruct the sorted list. + +## Complexity +- **Time Complexity**: + - The time complexity of Pigeonhole Sort is O(n + range), where n is the number of elements in the list and range is the difference between the maximum and minimum values. + + - This makes it efficient for lists with a small range of values. +- **Space Complexity**: The space complexity is O(range), as it requires additional space for the holes list. +- **Limitations**: Pigeonhole Sort is not suitable for lists with a large range of values, as it would require a lot of memory for the holes list. + +## Usage Example +```python +from PigeonHole_Sort import pigeonhole_sort + +arr = [4, 5, 3, 2, 1] +print("Original array:", arr) +writes = pigeonhole_sort(arr) +print("Sorted array:", arr) diff --git a/Data Structures and Algorithms/queues.py b/Data Structures and Algorithms/queues.py new file mode 100644 index 00000000..95f67510 --- /dev/null +++ b/Data Structures and Algorithms/queues.py @@ -0,0 +1,27 @@ +class Queue: + def __init__(self): + self.queue = [] + + def enqueue(self, item): + self.queue.append(item) + + def dequeue(self): + if not self.is_empty(): + return self.queue.pop(0) + return "Queue is empty" + + def is_empty(self): + return len(self.queue) == 0 + + def peek(self): + return self.queue[0] if not self.is_empty() else None + + def size(self): + return len(self.queue) + +# Example Usage +q = Queue() +q.enqueue(10) +q.enqueue(20) +print(q.dequeue()) # Output: 10 +print(q.peek()) # Output: 20