CSC 161 Grinnell College Fall, 2011
 
Imperative Problem Solving and Data Structures
 
 

Laboratory Exercise on Insertion Sort

Goals

The goal of this lab is to gain familiarity with the method of data sorting known as insertion sort, culminating in writing a simple insertion sort program.

Lab Exercises

Exercise 1: Reading Review

In today's reading, you learned about insertion sort. Write one to three sentences to answer each of the following questions.

  1. The reading claims that insertion sort is better for nearly-sorted lists than reverse-ordered lists. Why?
  2. How much extra memory is required for each sort?
  3. If the list is composed of four identical elements, how many elements change position when insertion sort is used? Why?
  4. Why might some people use insertion sort in real life?

Exercise 2: Manual Use of Insertion Sort

For each of the following lists, draw the result of each insertion of the insertion sorting routine. You do not need to show the result of each comparison, just the final insertion of the element.

  1. [ 5 | 4 | 1 ]
  2. [ 3 | 1 | 3 ]
  3. [ 2 | 5 | 4 | 0 ]
  4. [ 6 | 8 | 3 | 5 | 1 | 9 | 2 | 2 ]

Exercise 3: Identifying Insertion Sort

In this exercise, you will examine two sorting programs to determine if either is insertion sort. Download and save the programs insertion-sort-proc1.c and insertion-sort-proc2.c in your directory for this lab.

  1. Compile and run both programs. Do both sort the given list appropriately?

  2. Look at insertion-sort-proc1.c. Is this an example of insertion sort?

    Hint: What exactly are the nested for loops doing?

  3. Look at insertion-sort-proc2.c. Is this an example of insertion sort?

    Hint: What exactly is the while loop doing?

Exercise 4: Error Checking in Insertion Sort

Download and save the program insertion-sort-proc3.c in your directory for this lab.

  1. Compile and run the program with the values 1, 7, 3, 5, 4, 2, 9, 8, 2, 6. Does the program produce the correct output?

  2. Now run the program with a few of your own values. Does the program still produce correct output?

    Hint: try making some elements in the list negative.

  3. Read through the program to locate the source of the error and fix it.

    Hint: the error is caused by one line in the program.

  4. Write a paragraph explaining why this error caused the output you saw.

Exercise 5: Insertion Sort with Pictures

Download the file insertion-sort-picture.c and save it in your current directory. Read over the program and be sure you understand it. Using what you have learned in the previous exercises, write the insertion sort function that sorts the pixels in the picture, compile, and view the result. The program may take a couple minutes to run fully.

You will use this program in a future module, so you may wish to save this program.

Exercise 6: Insertion Sort with Column-Major Order

In Module 2, you learned about arrays. In this module, you learned about multidimensional arrays. Below is an example of initializing a two-dimensional array:

int array[2][5] = { {4, 3, 8, 2, 5}, {2, 1} };

In this example, the array of integers array has two rows, with the first row initialized with the values 4, 3, 8, 2, and 5, and the second row with the first two values initialized (2 and 1), and the remaining values are implicitly initialized to 0. So, a human-readable version of this two-dimensional array looks like the following:

Human-readable array of two rows and five columns

However, when you initialize the array in C, the program reserves a contiguous amount of memory for the array and assigns the values that have been specified. So, the above array is represented in memory as the following:

Memory representation of 2D array in C

As you notice, the C program puts the array in memory a row at a time, beginning from the first row. This is called row-major order, and is the C standard. Other programming languages, such as Fortran, use column-major order, in which each column is stored in memory contiguously. So, in column-major order, the array looks like the following:

Memory representation of column-major order

When sorting a single-dimensional array in C, the most common method is to sort the elements from smallest to largest. Though sorting a multidimensional array is much less frequent, one method is to perform essentially the same method by sorting each row, so the rows are in order, but the columns are not.

  1. Write a program that, using insertion sort, sorts a two-dimensional array in row-column order such that the elements in each row go from smaller to larger.
  2. Now, write a program that takes a two-dimensional array and, using insertion sort, sorts it in column-major order, so the values in the top of each column are the smallest in the column, with the largest value in each column in the bottom.

Note that for this exercise, you should not perform a normal insertion sort (row-major order) and simply paste the result in the "column-major sorted" array.

Reminder: Complete Evaluation Form

When you have finished this lab, be sure to fill out its evaluation form in the "Lab Evaluation" section for CSC 161 on Pioneer Web.