CSC 151.01, Class 35: An introduction to sorting
Overview
- Preliminaries
- Notes and news
- Upcoming work
- Extra credit
- Questions
- The problem of sorting
- Writing sorting algorithms
- Some examples
- Formalizing the problem
Preliminaries
News / Etc.
- New partners!
- I should get responses to project proposals done by Friday.
- Upcoming schedule
- Friday: Project time (plus quiz)
- Monday and Wednesday: More sorting (labs)
- Friday May 4: TBD
- Monday May 7: Project presentations (5 min each)
- Tuesday May 8: Exam 4 due
- Wednesday: May 9: Debrief on class
- Friday, May 11: Wrapup (required) + Review for final (optional)
Upcoming work
- No lab writeup.
- Flash Cards due TONIGHT at 9pm.
- Optional.
- Grade is percent of eight flashcard assignments you complete (capped at 100%).
- No reading for Friday.
- Quiz Friday: Searching (association lists, sequential search,
binary search)
- Sample question: Suppose our data have this form. Write a
call to
assoc(orbinary-search) to extract this part of one datum. - Sample question: Interpret the following call to
assoc; what results will you get? - Sample question: In the following call to
binary-search, what values does the binary search procedure examine? - Sample question: Fill in the following template for
assoc-all.
- Sample question: Suppose our data have this form. Write a
call to
Extra credit (Academic/Artistic)
- Vance Byrd Book Talk Thursday at 4:15 pm, Burlilng 1st Floor Lounge
Extra credit (Peer)
- Thursday, April 26th, Noyce 2022: Mellon Mays Project introductions, 4:15 to 6:30 p.m.
- Dance Ensemble Thursday 7:30pm, Friday 7:30pm, Saturday 7:30pm, Sunday 2pm. Roberts. Tickets still left.
- Open Mike Thursday 9-11pm in Bob’s.
- Friday, 8pm, Main: Contra Dance
Extra credit (Recurring peer)
- Listen to KDIC Wednesdays at 6pm - Witty banter with other
personalities and/or co-host. Also Indian, Arabic, and Farsi music.
(Up to two units of extra credit.) - Listen to KDIC Thursday at 7pm - Classic Rock. (60’s and 70’s)
- Peer editing with SS. Talk to SS about the details. Make your English Lit more literate.
Extra credit (Misc)
- Any Sexual Assault Awareness Month event.
Other good things
Questions
The problem of sorting
Quick review: What are the parameters to binary-search? What are the
parameters to sort?
(binary-search vec get-key may-precede? key)vecis a vector of compound values (maybe lists, or vectors, or …?) organized according tomay-precede?get-keyis a procedure that extracts a “key” from one entry in the vector. A key is the element of an entry that you use as you search; the kind of info that you’re searching for.may-precede?relates to the keys, we usedstring-ci<=?for strings and<=for numbers and ….may-precede?describes the ordering of the vector, which is important for more efficient searching.
key: What we’re looking fora
(sort lst comparator)lstis a list of valuescomparator- a way to compare two values for order, a lot like themay-precede?inbinary-search.
- Key differences
- The
sortworks with lists,binary-searchworks with vectors.- To use binary-search on an unsorted vector, we’d need to do some converstion.
- Alternately, we could write (or hope there exists) a sort for vectors.
- There’s no
get-keyinsort. Why don’t we need it? Alternately, how would you sort'(("Rebelsky" "Samuel") ("Klinge" "Titus") ("Walker" "Henry") ...)by first name?a- We build the
get-keyinto our comparator. - Not quite:
(sort faculty (string-<=? (cadr p1) (cadr p2))) (let ([first-name-<=? (lambda (p1 p2) (string<=? (cadr p1) (cadr p2)))]) (sort faculty first-name-<=?))(sort faculty (lambda (p1 p2) (string-<=? (cadr p1) (cadr p2))))
- We build the
- The
How do we do binary search if the vector contains, say, only numbers? (That is, they aren’t really compound data.)
- The procedure
binary-searchstill assumes that we have aget-key. - Each value is its own key.
get-keywill be(lambda (x) x).
Writing sorting algorithms
Our goal: To come up with a strategy for sorting vectors that does not
involve calling the built-in sort for lists.
- Note: One strategy for developing algorithms is to think about how you’d do it by hand.
OB+MS sort
- Set position to 0-
- Compare position 0 and position 1. If the value at position 0 may precede the value at position 1, do nothing.
- Go to the next position
- If the two are out of order, swap them and “jump back” to the previous position
- Note: We don’t back up when the position is 0.
We think this will work, but it will take a lot of time.
Insertion sort
- Divide the world into “stuff that’s sorted” and “stuff that’s not yet sorted”.
- Take the first thing in the not sorted, working from the left, find out where they belong
- Shift everyone down so that there’s room
- Do it all again
What do you think?
- Looks correct, but also slow.
- Bad: Always grab the shortest person, lots of shifting: Shift 0, shift 1, shift 2, shift 3, shift 4, ….
- Also bad: Always grab the tallest person, lots of comparsioni
- Approximately n*(n+1)/2 “steps” (comparison or shift)
Another algorithm: Selection sort
- Once again, divide into sorted and unsorted.
- Find the “smallest” unsorted.
- Put it at the front of unsorted.
- Do it again.
- Finding the smallest in a group of n things, takes about n steps.
- n + n-1 + n-2 + … +1. Another n*(n+1)/2 “steps” algorithm.
Here’s a question that lots of people face(d) when studying sorting: Can we do better than “about n*(n+1)/2 steps”?
Hmmm … binary search changed something that took n steps into something that took much fewer than n steps. (log n) steps, for the mathematically inclined.
- Binary search uses “divide and conquer”.
- Maybe we can use something similar for sorting.
Divide-and-conquer sorting
Idea number one: Just like insertion sort, except use binary search to find the position.
- Sam notes that you still have the high cost of shifting.
- Sam notes that if you have lists, looking in the middle is hard.
Idea number two: Find the median. Divide into things less than the median and greater than the median. Sort the two halves. Join ‘em together.
- Sam notes that it’s hard to find the median.
- Students ask “How do we write swap`?
(define vector-swap!
(lambda (vec pos1 pos2)
(let [(tmp1 (vector-ref vec pos1))
(tmp2 (vector-ref vec pos2))]
(vector-set! vec pos1 tmp2)
(vector-set! vec pos2 tmp1))))
Idea number three: Divide in half. Sort each half. Then …?
- Sam notes that the last step is hard. But we’ve written it before.