How to write a Quicksort Algorithm in Python

2 min read 535 words

Table of Contents

While there are libraries available for all programming languages that offer abilities to sort list, arrays and collections, it is important to know how this is achieved.

Learning how to write a quicksort algorithm yourself gives the ability to better understand the programming language of your choice and how to optimise code where possible.

Today we will explore writing a quicksort algorithm in the Python programming language.

Let’s start by defining a list of integers that are clearly not in order:

unordered = [97, 200, 100, 101, 211, 107]

Next, we need to create a function, which we will call quicksort that will house our algorithm. We will give it our unsorted list and it will return a sorted list once done.

# Create a function with 3 arguments
# `list` = an unsorted list
# `start` = index where to start sorting
# `end` = index where to end sorting
def quicksort(list, start=0, end=None):
    if end is None:
        end = len(list) - 1

    # an internal recursion function to do all the work
    def _quicksort(list, start, end):
        if start >= end: return
        pivot = partition(list, start, end)
        _quicksort(list, start, pivot-1)
        _quicksort(list, pivot+1, end)
        return list
    
    # call our internal function and return
    return _quicksort(list, start, end)

We’re not done quite yet, we still need to write our partition function that will return a new pivot point on each run.

# Create another function with 3 arguments
# `list` = a list
# `start` = starting index
# `end` = ending index
def partition(list, start, end):
    # start by setting our pivot point at the start
    pivot = start
    for i in range(start+1, end+1):
        if list[i] <= list[start]:
            pivot += 1

            # swap loop index and pivot around
            list[i], list[pivot] = list[pivot], list[i]

    # swap pivot and start values around
    list[pivot], list[start] = list[start], list[pivot]

    # return our new pivot
    return pivot

Now let’s put it all together and try it out!

# Create a function with 3 arguments
# `list` = an unsorted list
# `start` = index where to start sorting
# `end` = index where to end sorting
def quicksort(list, start=0, end=None):
    if end is None:
        end = len(list) - 1

    # an internal recursion function to do all the work
    def _quicksort(list, start, end):
        if start >= end: return
        pivot = partition(list, start, end)
        _quicksort(list, start, pivot-1)
        _quicksort(list, pivot+1, end)
        return list
    
    # call our internal function and return
    return _quicksort(list, start, end)


# Create another function with 3 arguments
# `list` = a list
# `start` = starting index
# `end` = ending index
def partition(list, start, end):
    # start by setting our pivot point at the start
    pivot = start
    for i in range(start+1, end+1):
        if list[i] <= list[start]:
            pivot += 1

            # swap loop index and pivot around
            list[i], list[pivot] = list[pivot], list[i]

    # swap pivot and start values around
    list[pivot], list[start] = list[start], list[pivot]

    # return our new pivot
    return pivot

What do we get when we call it with our unsorted list from before?

unsorted = [97, 200, 100, 101, 211, 107]

print(quicksort(unsorted))

# [97, 100, 101, 107, 200, 211]

Ah, lovely, we now have a sorted list of integers compliments of our quicksort python function!

Andrew
Andrew

Andrew is a visionary software engineer and DevOps expert with a proven track record of delivering cutting-edge solutions that drive innovation at Ataiva.com. As a leader on numerous high-profile projects, Andrew brings his exceptional technical expertise and collaborative leadership skills to the table, fostering a culture of agility and excellence within the team. With a passion for architecting scalable systems, automating workflows, and empowering teams, Andrew is a sought-after authority in the field of software development and DevOps.

Tags