Python’s list method sort includes the keyword argument reverse, whose default value is False. The programmer can override this value to sort a list in descending order.
Modify the selectionSort function discussed in this chapter so that it allows the programmer to supply this additional argument (as the second parameter) to redirect the sort.
This is what I have so far:
def selectionSort(lyst,reverse):
"""Sorts the items in lyst in ascending order."""
i = 0
while i < len(lyst) - 1: # Do n – 1 searches
minIndex = i # for the smallest item
j = i + 1
while j < len(lyst): # Start a search
if lyst[j] < lyst[minIndex]:
minIndex = j
j += 1
if minIndex != i: # Swap if necessary
swap(lyst, minIndex, i)
i += 1
def swap(lyst, x, y):
"""Exchanges the elements at positions x and y."""
lyst[x], lyst[y] = lyst[y], lyst[x]
def main():
"""Tests with four lists."""
lyst = [2, 4, 3, 0, 1, 5]
selectionSort(lyst)
print(lyst)
lyst = list(range(6))
selectionSort(lyst)
print(lyst)
lyst = [2, 4, 3, 0, 1, 5]
selectionSort(lyst, reverse = True)
print(lyst)
lyst = list(range(6))
selectionSort(lyst, reverse = True)
print(lyst)
if __name__ == "__main__":
main()
>Solution :
The first issue is you have defined a second parameter to your function. This will cause your current tests to fail. To fix this, you can set a default to False
to keep your existing behavior working.
Check out default arguments
Then based on the flag you can perform different logic. See the code notes below, we add a check to see if reverse
is True
or False
. if default or set to False
we will do normal order. if True
, we will do your current logic backwards, using max instead of min.
def selectionSort(lyst,reverse=False):
"""Sorts the items in lyst in ascending order."""
if not reverse:
# do your old code
i = 0
while i < len(lyst) - 1: # Do n – 1 searches
minIndex = i # for the smallest item
j = i + 1
while j < len(lyst): # Start a search
if lyst[j] < lyst[minIndex]:
minIndex = j
j += 1
if minIndex != i: # Swap if necessary
swap(lyst, minIndex, i)
i += 1
if reverse:
# reverse your code
i = 0
while i < len(lyst) - 1: # Do n – 1 searches
maxIndex = i # for the largest item
j = i + 1
while j < len(lyst): # Start a search
if lyst[j] > lyst[maxIndex]:
maxIndex = j
j += 1
if maxIndex != i: # Swap if necessary
swap(lyst, maxIndex, i)
i += 1
def swap(lyst, x, y):
"""Exchanges the elements at positions x and y."""
lyst[x], lyst[y] = lyst[y], lyst[x]
def main():
"""Tests with four lists."""
lyst = [2, 4, 3, 0, 1, 5]
selectionSort(lyst)
print(lyst)
# test with trues
lyst = [2, 4, 3, 0, 1, 5]
selectionSort(lyst, True)
print(lyst)
lyst = list(range(6))
selectionSort(lyst)
print(lyst)
lyst = [2, 4, 3, 0, 1, 5]
selectionSort(lyst, reverse = True)
print(lyst)
lyst = list(range(6))
selectionSort(lyst, reverse = True)
print(lyst)
if __name__ == "__main__":
main()
Now that the difference in the parameter is explained, you could further improve your code based on the single operation being changed:
i = 0
while i < len(lyst) - 1: # Do n – 1 searches
index = i # for the item
j = i + 1
while j < len(lyst): # Start a search
if not reverse:
if lyst[j] < lyst[index]:
index = j
else:
if lyst[j] > lyst[index]:
index = j
j += 1
if index != i: # Swap if necessary
swap(lyst, index, i)
i += 1