Given an array of integers nums, sort the array in ascending order. quick sort py
- code
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
self.quickSort(nums, 0, len(nums)-1)
return nums
def quickSort(self, arr, left, right):
mid = (left + right) // 2
arr[mid], arr[right] = arr[right], arr[mid] # pick the mid as pivot every time
if left < right:
pivot = self.partition(arr, left, right)
self.quickSort(arr, left, pivot-1)
self.quickSort(arr, pivot+1, right)
def partition(self, arr, left, right):
i = left
pivot = arr[right]
for n in range(left, right):
if arr[n] < pivot:
arr[i], arr[n] = arr[n], arr[i]
i += 1
arr[right], arr[i] = arr[i], arr[right]
return i
- code
class Solution(object):
def sortArray(self, nums):
self.quickSort(nums, 0, len(nums) - 1)
return nums
def quickSort(self, nums, start, end):
if start < end:
# we get mid index for pivot element
mid_idx = (start+end)//2
#we swap first and mid index element
nums[start],nums[mid_idx] = nums[mid_idx],nums[start]
p_index = self.partition(nums, start, end)
#we need recursive calls left and right side
self.quickSort(nums, start, p_index-1)
self.quickSort(nums, p_index+1, end)
def partition(self, nums, start, end):
low = start + 1
high = end
pivot = nums[start]
while True:
# indicates we have already moved all the elements to their correct side of the pivot
while low <= high and nums[high] >= pivot:
high -= 1
# Opposite process of the one above
while low <= high and nums[low] <= pivot:
low += 1
if (low <= high):
nums[low],nums[high] = nums[high],nums[low]
else:
break
nums[start], nums[high] = nums[high], nums[start]
return high