MENU

Fun & Interesting

All Quicksort does is call this function - Partition!

0612 TV w/ NERDfirst 1,750 lượt xem 1 year ago
Video Not Working? Fix It Now

Quicksort is an algorithm that has a ton of variation to it - Today, we break down this algorithm into its constituent parts, Partitioning and recursion, and try to understand what it is about Quicksort that stays the same between implementations, and what changes.

Timestamps For Your Convenience
0:00 Introduction
0:26 Basics of Quicksort
1:39 Introduction to Partioning
2:20 Relationship between Partitioning and Quicksort
2:39 The Quicksort "Driver"
5:01 Partitioning Algorithm #1: The Intuitive One
6:40 Partitioning Algorithm #2: Lomuto's Scheme
8:55 Partitioning Algorithm #3: Hoare's Scheme
11:57 Time Complexity of Partitioning
13:00 Time Complexity of Quicksort & Pivot Choice
15:18 Conclusion

Here's the pseudocode used in the video:

*Main Quicksort Driver*
proc QuickSort(array, start_index, end_index)
if start_index ≥ end_index
        return array
endIf

    pivot_index ← pick random integer between start_index and end_index
    new_pivot_index, array ← Partition(array, start_index, end_index, pivot_index)

    array ← QuickSort(array, start_index, new_pivot_index - 1)
    array ← QuickSort(array, new_pivot_index + 1, end_index)

    return array
endProc

*Intuitive Partitioning Algorithm*
proc Partition_Intuitive(array, start_index, end_index, pivot_index)
smaller_array ← create empty array
larger_array ← create empty array

pivot ← array[pivot_index]
for i from start_index to end_index (inclusive)
if array[i] ≤ pivot
            add array[i] to smaller_array
        else
            add array[i] to larger_array
        endIf
endFor

    new_pivot_index ← start_index + length of smaller_array

    replace array[start_index to new_pivot_index-1] with smaller_array
    replace array[new_pivot_index] with pivot
    replace array[new_pivot_index+1 to end_index] with larger_array

    return new_pivot_index, array
endProc

*Lomuto's Partitioning Scheme*
proc Partition_Lomuto(array, start_index, end_index, pivot_index):
swap array[end_index] with array[pivot_index]
pivot ← array[end_index]

i ← start_index – 1 (before first element)

for j from start_index to end_index-1:
if array[j] ≤ pivot:
i ← i + 1
swap array[i] and array[j]
endIf
endFor

i ← i + 1 (set pivot location)
swap arr[i] and arr[right]
new_pivot_index ← i

return new_pivot_index, array

*Hoare's Partitioning Scheme (Modified)*
proc Partition_Hoare_FixedPivot(array, start_index, end_index, pivot_index)
mid ← floor((start_index + end_index) / 2)
swap array[pivot_index] with array[start_index]
pivot ← arr[start_index]

i ← start_index – 1
j ← end_index + 1

while True:
do i ← i + 1
while array[i] < pivot
do j ← j - 1
while array[j] > pivot
if i ≥ j:
swap array[start_index] and array[j]
return j, array
swap arr[i] and arr[j]
endProc


-----

Want to contribute to the channel? Consider using the "Super Thanks" feature above, or visit my website at https://nerdfirst.net/donate to find alternative ways to donate. Thank you!

-----

Disclaimer: Please note that any information is provided on this channel in good faith, but I cannot guarantee 100% accuracy / correctness on all content. Contributors to this channel are not to be held responsible for any possible outcomes from your use of the information.

Comment