# 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.

- The reading claims that insertion sort is better for nearly-sorted lists than reverse-ordered lists. Why?
- How much extra memory is required for each sort?
- If the list is composed of four identical elements, how many elements change position when insertion sort is used? Why?
- 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.

- [ 5 | 4 | 1 ]
- [ 3 | 1 | 3 ]
- [ 2 | 5 | 4 | 0 ]
- [ 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.

- Compile and run both programs. Do both sort the given list appropriately?
- Look at
`insertion-sort-proc1.c`

. Is this an example of insertion sort?Hint: What exactly are the nested

`for`

loops doing? - 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.

- 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?
- 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.

- 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.

- 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:

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:

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:

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.

- 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.
- 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.