CSC 103 Lecture Notes Week 8
Sorting
/****
*
* Class ListSortAndSearch contains sorting and searching algorithms for
* array-based lists. The sorting algorithms are O(N<sup>2</sup>) bubble sort
* and insertion, plus O(N log N) heap sort and quicksort. Two searching
* algorithms are provided -- an O(N) linear search and and O(log N) binary
* search.
*
* @author Gene Fisher
* @version 22may01
*
*/
public class ListSortAndSearch {
/**
* Perform a bubble sort on the given list.
*/
public void bubbleSort(Object[] list) {
int i, j; // Traversal indices
int k; // Trace loop index
Object temp; // Temp variable for swapping
/*
* Outta here if list is empty.
*/
if ((list == null) || (list.length == 0)) {
return;
}
/*
* Use a basic bubble sort algorithm.
*/
for (i = 0; i < list.length-1; i++) {
for (j = list.length - 2; i <= j; j--) {
printTraceLine("Pass " + i + "," + j + ": ", list);
/*
* Swap the jth and j+1th elements if jth is > j+1th
*/
if (((Comparable)(list[j])).compareTo(list[j+1]) > 0) {
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
}
/**
* Perform an insertion sort on the given list.
*/
public void insertionSort(Comparable[] list) {
int i, j; // Traversal indices
int k; // Trace loop index
Comparable temp; // Temp variable for swapping
for (i = 1; i < list.length; i++) {
/*
* Use a basic insertion sort algorithm.
*/
temp = list[i];
for (j = i; j > 0 && temp.compareTo(list[j-1]) < 0; j--) {
printTraceLine("Pass " + i + "," + j + ": ", list);
/*
* Move a smaller element down a position.
*/
list[j] = list[j-1];
}
list[j] = temp;
}
}
/**
* Perform an iterative linear search of the given list for the given
* element. Assume the list is not null. Return the index position of the
* first occurrence of the element if found, -1 otherwise.
*/
public int linearSearch(Object[] list, Object element) {
int i; // Traversal index
/*
* Search this list.
*/
for (i = 0; i < list.length; i++) {
if (element.equals(list[i])) {
return i;
}
}
/*
* Return failure if not found.
*/
return -1;
}
/**
* Perform an iterative binary search of the given list for the given
* element. Assume the list is not null. Return the index position of the
* first occurrence of the element if found, -1 otherwise.
*/
public int binarySearch(Object[] list, Object element) {
int startPos = 0; // Initial start position
int endPos = list.length - 1; // Initial end position
/*
* Iterate through the list while the length of the startPos/endPos
* interval is >= 1 and we haven't yet found the searched-for element.
* For each loop iteration, compute the interval midpoint and then do
* one of the following:
*
* (a) If the searched-for element is at the midpoint, return
* successfully.
*
* (b) If the searched-for element is less than the midpoint
* element, search the lower half of the list.
*
* (c) If the searched-for element is greater than the midpoint
* element, search the upper half of the list.
*/
while (startPos <= endPos) {
int midpoint = (startPos + endPos) / 2;
if (element.equals(list[midpoint]))
return midpoint;
else if (((Comparable)element).compareTo(list[midpoint]) < 0 )
endPos = midpoint - 1;
else
startPos = midpoint + 1;
}
/*
* Fail if we never find the element.
*/
return -1;
}
/**
* Make a space-delimited string out of the elements of an array-based
* list.
*/
public String toString(Object[] list) {
String result = ""; // Return result
int i; // Loop index
for (i = 0; i < list.length; i++) {
result = result + list[i].toString() + " ";
}
return result;
}
/**
* Turn tracing on or off.
*/
public void setTracingOn(boolean on) {
tracingOn = on;
}
/**
* If this.tracingOn is true, print a line of tracing information to
* stdout. The inforation consists of the given string message followed by
* a space-delimited list of the elements in the give array. This method
* is called from within the sorting methods to help trace the progress of
* the sort.
*/
protected void printTraceLine(String message, Object[] array) {
if (tracingOn) {
System.out.print(message + toString(array));
}
}
/** Method tracing is on if tracingOn == true. */
protected boolean tracingOn = false;
}
public class ListSortTrace {
public static void main(String[] args) {
ListSortAndSearch sortAndSearch = // Class with the methods
new ListSortAndSearch();
Integer[] listRandom = // Testing list random order
{new Integer(34), new Integer(8), new Integer(64),
new Integer(51), new Integer(32), new Integer(21)};
Integer[] listUnsorted = // Testing list fully unsorted
{new Integer(64), new Integer(51), new Integer(34),
new Integer(32), new Integer(21), new Integer(8)};
Integer[] listRandom2 =
{new Integer(34), new Integer(8), new Integer(64),
new Integer(51), new Integer(32), new Integer(21)};
Integer[] listUnsorted2 =
{new Integer(64), new Integer(51), new Integer(34),
new Integer(32), new Integer(21), new Integer(8)};
int i,j; // Loop indices
final int SIZE = 15; // Size of test list
Integer lastValue; // Last value in sorted list
int index; // Index of search item
sortAndSearch.sort(listRandom);
System.out.println();
sortAndSearch.sort(listUnsorted);
System.out.println();
sortAndSearch.insertionSort(listRandom2);
System.out.println();
sortAndSearch.insertionSort(listUnsorted2);
}
}
Bubble sorting pass 0,4: 34 8 64 51 32 Bubble sorting pass 0,3: 34 8 64 51 21 Bubble sorting pass 0,2: 34 8 64 21 51 Bubble sorting pass 0,1: 34 8 21 64 51 Bubble sorting pass 0,0: 34 8 21 64 51 Bubble sorting pass 1,4: 8 34 21 64 51 Bubble sorting pass 1,3: 8 34 21 64 32 Bubble sorting pass 1,2: 8 34 21 32 64 Bubble sorting pass 1,1: 8 34 21 32 64 Bubble sorting pass 2,4: 8 21 34 32 64 Bubble sorting pass 2,3: 8 21 34 32 51 Bubble sorting pass 2,2: 8 21 34 32 51 Bubble sorting pass 3,4: 8 21 32 34 51 Bubble sorting pass 3,3: 8 21 32 34 51 Bubble sorting pass 4,4: 8 21 32 34 51 Bubble sorting pass 0,4: 64 51 34 32 21 Bubble sorting pass 0,3: 64 51 34 32 8 Bubble sorting pass 0,2: 64 51 34 8 32 Bubble sorting pass 0,1: 64 51 8 34 32 Bubble sorting pass 0,0: 64 8 51 34 32 Bubble sorting pass 1,4: 8 64 51 34 32 Bubble sorting pass 1,3: 8 64 51 34 21 Bubble sorting pass 1,2: 8 64 51 21 34 Bubble sorting pass 1,1: 8 64 21 51 34 Bubble sorting pass 2,4: 8 21 64 51 34 Bubble sorting pass 2,3: 8 21 64 51 32 Bubble sorting pass 2,2: 8 21 64 32 51 Bubble sorting pass 3,4: 8 21 32 64 51 Bubble sorting pass 3,3: 8 21 32 64 34 Bubble sorting pass 4,4: 8 21 32 34 64 Insertion sorting pass 1,1: 34 8 64 51 32 Insertion sorting pass 3,3: 8 34 64 51 32 Insertion sorting pass 4,4: 8 34 51 64 32 Insertion sorting pass 4,3: 8 34 51 64 64 Insertion sorting pass 4,2: 8 34 51 51 64 Insertion sorting pass 5,5: 8 32 34 51 64 Insertion sorting pass 5,4: 8 32 34 51 64 Insertion sorting pass 5,3: 8 32 34 51 51 Insertion sorting pass 5,2: 8 32 34 34 51 Insertion sorting pass 1,1: 64 51 34 32 21 Insertion sorting pass 2,2: 51 64 34 32 21 Insertion sorting pass 2,1: 51 64 64 32 21 Insertion sorting pass 3,3: 34 51 64 32 21 Insertion sorting pass 3,2: 34 51 64 64 21 Insertion sorting pass 3,1: 34 51 51 64 21 Insertion sorting pass 4,4: 32 34 51 64 21 Insertion sorting pass 4,3: 32 34 51 64 64 Insertion sorting pass 4,2: 32 34 51 51 64 Insertion sorting pass 4,1: 32 34 34 51 64 Insertion sorting pass 5,5: 21 32 34 51 64 Insertion sorting pass 5,4: 21 32 34 51 64 Insertion sorting pass 5,3: 21 32 34 51 51 Insertion sorting pass 5,2: 21 32 34 34 51 Insertion sorting pass 5,1: 21 32 32 34 51
[8, 5, 3, 1, 0, 9, 7, 4]
mergesort([8, 5, 3, 1, 0, 9, 7, 4])
mergesort([8, 5, 3, 1])
mergesort([8, 5])
mergesort([8])
mergesort([5])
merge([] , [5])
mergesort([3, 1])
mergesort([3])
mergesort([1])
merge([] , [1])
merge([5] , [1, 3])
mergesort([0, 9, 7, 4])
mergesort([0, 9])
mergesort([0])
mergesort([9])
merge([] , [9])
mergesort([7, 4])
mergesort([7])
mergesort([4])
merge([] , [4])
merge([0] , [4, 7])
merge([1, 3, 5] , [0, 4, 7, 9])
[0, 1, 3, 4, 5, 7, 8, 9]
Quicksort:
[8, 5, 3, 1, 0, 9, 7, 4, 2, 6]
before pivot, low=0,high=9,pivot=0 [8, 5, 3, 1, 0, 9, 7, 4, 2, 6]
before partition, low=0,high=9,pivot=2 [0, 5, 3, 1, 2, 9, 7, 4, 6, 8]
after partition, low=0,high=9,pivot=2 [0, 5, 3, 1, 2, 4, 6, 9, 7, 8]
before pivot, low=0,high=5,pivot=3 [0, 5, 3, 1, 2, 4, 6, 9, 7, 8]
before partition, low=0,high=5,pivot=2 [0, 5, 2, 1, 3, 4, 6, 9, 7, 8]
after partition, low=0,high=5,pivot=2 [0, 1, 2, 3, 5, 4, 6, 9, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]