Exercises for Lesson 26
Exercise: Running time of selection sort
Here is the Python code for selection sort:
def getMinIndex(mylist, start):
"""
Finds the position of the minimum element in mylist,
starting at position start.
Returns: position (>= start) of minimum element
"""
# Find the minimum element of those from startIdx
# to the end of the list
minIdx = start
for i in range(start+1, len(mylist)):
# Is this one smaller?
if mylist[i] < mylist[minIdx]:
# If so, update the index we're tracking
minIdx = i
return minIdx
def selectionSort(mylist):
"""
Sorts the provided list using the Selection Sort algorithm.
Returns: None (sorts in place)
"""
n = len(mylist)
# Consider each starting index except the last, as that
# will be the maximum element in the list by the time
# we finish with the second-to-last position
for startIdx in range(n-1):
minIdx = getMinIndex(mylist, startIdx)
# Swap to put the minimum element (of those startIdx->end)
# in position startIdx
mylist[startIdx], mylist[minIdx] = mylist[minIdx], mylist[startIdx]Part a: Predicting running times
Recall that we said that selection sort makes a number of comparisons (the if condition check in the code above) equal to n(n-1)/2. Using that information, fill in the following table.
| n | # comparisons | |||
|---|---|---|---|---|
| 2 | ||||
| 4 | ||||
| 8 | ||||
| 16 | ||||
| 32 | ||||
| 64 | ||||
| 128 | ||||
| 256 |
Part b: Plotting running times
The expression in part (a) is roughly equal to n**2 as n gets really big. Download this selection sort program and run it to graph how long it takes to sort a random list, on average.
Note that with num_trials=1000 data points per value of n and with the given list of values of n, it might take at least five minutes to run. You can decrease num_trials to make it run faster, although then it won’t test with as much data.