## Quick Sort - Divide the given array into two and sort each - Differences from merge sort 1. While merge sort just divides into two parts, quick sort positions items smaller than the pivot item on the left and larger items on the right when dividing 2. After each part is sorted, merge sort requires "merging" post-processing work, but quick sort does not require it. - Time complexity - nlogn
### Hoare-Partition Algorithm #### Idea - Position values larger than P(pivot) in the right set and smaller values in the left set - Position the pivot in the middle of the two sets
#### Pivot Selection - Left end / Right end / Middle value among three arbitrary values
Example) ```python def quick_sort (arr, left, right): # Determine pivot position (separate large values to right, small values to left based on pivot) # Sort left subset # Sort right subset if left > right: return # Get pivot pivot = lomuto_partition(arr, left, right) pivot = hoare_partition(arr, left, right) # Execute left subset sorting quick_sort(arr, left, pivot-1) # Execute right subset sorting quick_sort(arr,pivot+1, right) def lomuto_partition(arr, left, right): # Set rightmost element as pivot, # i = left -1 # j = left pivot = arr[right] i = left -1 for j in range(left, right): # If arr[i] is smaller than pivot, if arr[j] < pivot: # Increase i by 1 # Swap positions of arr[j], arr[i] i += 1 arr[i], arr[j] = arr[j], arr[i] # Position i points to is the last index of values smaller than pivot # Place pivot at position i + 1 and return i+1 arr[i+1], arr[right] = arr[right], arr[i+1] return i+1 def hoare_partition(arr, left, right): # Set i, j and find large & small values to swap positions i = left j = right pivot = arr[left] # Continue repeating until i is smaller than j while i <= j: # Increase i until value larger than pivot appears while i<=j and arr[i] <= pivot: i += 1 # Decrease j until value smaller than pivot appears while i <=j and arr[j] >= pivot: j -= 1 # If i is smaller than j, swap positions if i < j: arr[i], arr[j] = arr[j], arr[i] arr[left], arr[j] = arr[j], arr[left] return j # Return j which is pivot position arr = [4,6,3,6,8,0,3,8,10] quick_sort(arr, 0, len(arr)-1) print(arr) ```