Topic 11
Sorting and Searching
"There's nothing in your head the
sorting hat can't see. So try me
on and I will tell you where you
ought to be."
-The Sorting Hat, Harry Potter
and the Sorcerer's Stone
Sorting and Searching
Sorting and Searching
Fundamental problems in computer science
and programming
Sorting done to make searching easier
Multiple different algorithms to solve the
same problem
How do we know which algorithm is "better"?
Look at searching first
Examples will use arrays of ints to illustrate
algorithms
Sorting and Searching
Searching
Sorting and Searching
Searching
Given a list of data find the location of a
particular value or report that value is not
present
linear search
intuitive approach
start at first item
is it the one I am looking for?
if not go to next item
repeat until found or all items checked
If items not sorted or unsortable this
approach is necessary
Sorting and Searching
/*
Linear Search
pre: list != null
post: return the index of the first occurrence
of target in list or -1 if target not present in
list
*/
int linearSearch(int list [], int target, int length)
BEGIN
FOR i = 0 TO i<length STEP 1
IF( list[i] == target )
return i;
ENDIF
ENDFOR
return -1;
END
Sorting and Searching
Searching in a Sorted List
If items are sorted then we can divide and
conquer
dividing your work in half with each step
generally a good thing
The Binary Search on List in Ascending order
Start at middle of list
is that the item?
If not is it less than or greater than the item?
less than, move to second half of list
greater than, move to first half of list
repeat until found or sub list size = 0
Sorting and Searching
Binary Search
list
low item
middle item
high item
Is middle item what we are looking for? If not is it
more or less than the target item? (Assume lower)
list
low
item
middle
item
high
item
and so forth
Sorting and Searching
Binary Search in Action
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2
11 13 17 19 23 29 31 37 41 43 47 53
public static int bsearch(int[] list, int target)
{
int result = -1;
int low = 0;
int high = list.length - 1;
int mid;
while( result == -1 && low <= high )
{
mid = low + ((high - low) / 2);
if( list[mid] == target )
result = mid;
else if( list[mid] < target)
low = mid + 1;
else
high = mid - 1;
}
return result;
}
// mid = ( low + high ) / 2; // may overflow!!!
// or mid = (low + high) >>> 1; using bitwise op
Sorting and Searching
Trace When Key == 3
Trace When Key == 30
Variables of Interest?
Sorting and Searching
Other Searching Algorithms
Interpolation Search
more like what people really do
Indexed Searching
Binary Search Trees
Hash Table Searching
Grover's Algorithm (Waiting for
quantum computers to be built)
best-first
A*
Sorting and Searching
10
Sorting
Sorting and Searching
11
Sorting
Sorting and Searching
12
Sorting
A fundamental application for computers
Done to make finding data (searching) faster
Many different algorithms for sorting
One of the difficulties with sorting is working
with a fixed size storage container (array)
if resize, that is expensive (slow)
The "simple" sorts run in quadratic time
O(N2)
bubble sort
selection sort
insertion sort
Sorting and Searching
13
Stable Sorting
A property of sorts
If a sort guarantees the relative order of
equal items stays the same then it is a stable
sort
[71, 6, 72, 5, 1, 2, 73, -5]
subscripts added for clarity
[-5, 1, 2, 5, 6, 71, 72, 73]
result of stable sort
Real world example:
sort a table in Wikipedia by one criteria, then another
sort by country, then by major wins
Sorting and Searching
14
Algorithm
Selection sort
Search through the list and find the smallest element
swap the smallest element with the first element
repeat starting at second element and find the second
smallest element
void selectionSort(int list[], int length)
BEGIN
int min,I,j;
int temp;
FOR i= 0 TO length 2 STEP 1
min = i;
FOR j = i + 1 TO j length-1 STEP 1
IF( list[j] < list[min] )
min = j;
ENDIF // swap them
temp = list[i];
list[i] = list[min];
list[min] = temp;
ENDFOR
ENDFOR
Sorting and Searching
15
Selection Sort in Practice
44 68 191 119 119 37 83 82 191 45 158 130 76 153 39 25
Sorting and Searching
16
Insertion Sort
The first item is sorted
Compare the second item to the first
if smaller swap
Third item, compare to item next to it
need to swap
after swap compare again
And so forth
Sorting and Searching
17
Insertion Sort Code
void insertionSort(int[] list, int n)
BEGIN
int temp, j;
FOR i = 1 TO n-1 STEP 1
temp = list[i];
j = i;
WHILE( j > 0 && temp < list[j - 1])
// swap elements
list[j] = list[j - 1];
list[j - 1] = temp;
j--;
ENDWIHLE
END
END
Sorting and Searching
18
Insertion Sort in Practice
44 68 191 119 119 37 83 82 191 45 158 130 76 153 39 25
Sorting and Searching
19
Comparing Algorithms
Which algorithm do you think will be faster
given random data, selection sort or insertion
sort?
Why?
Sorting and Searching
20
Comparison of Various Sorts
Num Items
Selection
Insertion
Shellsort
Quicksort
1000
16
2000
59
49
4000
271
175
8000
1056
686
11
10
16000
4203
2754
32
11
32000
16852
11039
37
45
64000
expected?
expected?
100
68
128000
expected?
expected?
257
158
256000
expected?
expected?
543
335
512000
expected?
expected?
1210
722
1024000
expected?
expected?
2522
1550
times in milliseconds
Sorting and Searching
21