# sort-an-array Try it on leetcode ## Description

Given an array of integers nums, sort the array in ascending order and return it.

You must solve the problem without using any built-in functions in O(nlog(n)) time complexity and with the smallest space complexity possible.

 

Example 1:

Input: nums = [5,2,3,1]
Output: [1,2,3,5]
Explanation: After sorting the array, the positions of some numbers are not changed (for example, 2 and 3), while the positions of other numbers are changed (for example, 1 and 5).

Example 2:

Input: nums = [5,1,1,2,0,0]
Output: [0,0,1,1,2,5]
Explanation: Note that the values of nums are not necessairly unique.

 

Constraints:

## Solution(Python) ```Python class Solution: def sortArray(self, nums: List[int]) -> List[int]: return self.countingSort(nums) # merge two sorted arrays # O(n) time complexity # O(n) space complexity def mergeSort(self, nums: List[int]) -> List[int]: if len(nums) <= 1: return nums mid = len(nums) // 2 left = self.mergeSort(nums[:mid]) right = self.mergeSort(nums[mid:]) return self.merge(left, right) # Heap sort # O(nlogn) time complexity # O(n) space complexity def heapSort(self, nums: List[int]) -> List[int]: heapq.heapify(nums) return [heapq.heappop(nums) for _ in range(len(nums))] # Counting Sort # Time Complexity: O(n + k) # SpaceComplexity : O(k) def countingSort(self, nums: List[int]) -> List[int]: min_num, max_num = min(nums), max(nums) count = [0] * (max_num - min_num + 1) for num in nums: count[num - min_num] += 1 result = [] for i, c in enumerate(count): result.extend([i + min_num] * c) return result def merge(self, left: List[int], right: List[int]) -> List[int]: result = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result ```