# Homework 16: Selection Sort

This homework assignment is also available in PDF.

Assigned:
Due:
No extensions!

Summary: In this assignment, you will explore another sorting algorithm, selection sort.

Expected Time: One to two hours.

Collaboration: You may work in a group of any size between one and four, inclusive. You may consult others outside your group, provided you cite those others. You need only submit one assignment per group.

Submitting: Email me your work, using a subject of CSC151 Homework 16.

Warning: So that this exercise is a learning assignment for everyone, I may spend class time publicly critiquing your work.

## Background: Selection Sort

As you may recall from our in-class discussion of sorting techniques, one popular strategy for sorting vectors involves repeatedly finding the smallest remaining value and then swapping it into the next place in the vector. We call this procedure selection sort because the primary operation is selecting the smallest value.

The process is fairly straightforward. For example, in a vector of 10 elements, selection sort

• Find the index of the smallest element in positions 0 .. 9 and swap it into position 0.
• Find the index of the smallest element in positions 1 .. 9 and swap it into position 1.
• Find the index of the smallest element in positions 2 .. 9 and swap it into position 2.
• ...
• Find the index of the smallest element in positions 8 .. 9 and swap it into position 8.

As that example suggests, a key helper for selection sort is finding the index of the smallest value in a subvector. We might document that procedure as follows:

```;;; Procedure:
;;;   index-of-smallest
;;; Parameters:
;;;   vec, a vector
;;;   pos, an integer
;;;   may-precede?, a binary predicate
;;; Purpose:
;;;   Find the index of the smallest value in positions [pos..len) of vec.
;;; Produces:
;;;   ios, an integer
;;; Preconditions:
;;;   may-precede? is transitive and reflexive.
;;;   0 <= pos < (vector-length vec).
;;;   vec contains no duplicate values.
;;; Postconditions:
;;;   For all i, pos <= i < (vector-length vec), i not equal to ios,
;;;     (may-precede? (vector-ref vec ios) (vector-ref vec i)).
```

## Assignment

a. Implement `index-of-smallest`.

b. Implement `(swap! vec i j)`, a procedure that swaps the values at positions `i` and `j` of `vec`.

c. Using `index-of-smallest` and `swap!`, implement `selection-sort!`. Note that you will probably want to iterate over the position in the vector.

## History

Sunday, 12 November 2006 [Samuel A. Rebelsky]

• Created.

Monday, 13 November 2006 [Samuel A. Rebelsky]

• Added the necessary pos parameter to `index-of-smallest`.

Monday, 23 April 2007 [Samuel A. Rebelsky]

• Minor cleanup for new semester.

Disclaimer: I usually create these pages on the fly, which means that I rarely proofread them and they may contain bad grammar and incorrect details. It also means that I tend to update them regularly (see the history for more details). Feel free to contact me with any suggestions for changes.

This document was generated by Siteweaver on Wed Aug 29 08:59:28 2007.
The source to the document was last modified on Sun Jul 29 16:13:00 2007.
This document may be found at `http://www.cs.grinnell.edu/~rebelsky/Courses/CS151/2007F/Homework/hw.16.html`.

You may wish to validate this document's HTML ; ;

Samuel A. Rebelsky, rebelsky@grinnell.edu

Copyright © 2007 Janet Davis, Matthew Kluber, and Samuel A. Rebelsky. This material is based upon work partially supported by the National Science Foundation under Grant No. CCLI-0633090. Any opinions, findings, and conclusions or recommendations expressed in this material are those of the author(s) and do not necessarily reflect the views of the National Science Foundation. This work is licensed under a Creative Commons Attribution-NonCommercial 2.5 License. To view a copy of this license, visit `http://creativecommons.org/licenses/by-nc/2.5/` or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.