Академический Документы
Профессиональный Документы
Культура Документы
Chapter 8
Kruse and Ryba
Introduction
• Common problem: sort a list of values, starting
from lowest to highest.
– List of exam scores
– Words of dictionary in alphabetical order
– Students names listed alphabetically
– Student records sorted by ID#
• Generally, we are given a list of records that have
keys. These keys are used to define an ordering of
the items in the list.
C++ Implementation of Sorting
• Use C++ templates to implement a generic sorting
function.
• This would allow use of the same function to sort items
of any class.
• However, class to be sorted must provide the following
overloaded operators:
– Assignment: =
– Ordering: >, <, ==
• Example class: C++ STL string class
• In this lecture, we’ll talk about sorting integers;
however, the algorithms are general and can be applied
to any class as described above.
Quadratic Sorting Algorithms
• We are given n records to sort.
• There are a number of simple sorting
algorithms whose worst and average case
performance is quadratic O(n2):
– Selection sort
– Insertion sort
– Bubble sort
Sorting an Array of Integers
• Example: we
are given an 70
array of six 60
integers that 50
we want to 40
sort from 30
smallest to 20
largest
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
• Start by
finding the 70
smallest 60
entry. 50
40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
• Swap the
smallest 70
entry with 60
the first 50
entry. 40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
• Swap the
smallest 70
entry with 60
the first 50
entry. 40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
Sorted side Unsorted side
70
• Part of the 60
array is now 50
sorted. 40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
Sorted side Unsorted side
70
• Find the 60
smallest 50
element in 40
the unsorted 30
side.
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
Sorted side Unsorted side
70
• Swap with 60
the front of 50
the unsorted 40
side. 30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
Sorted side Unsorted side
70
• We have 60
increased the 50
size of the 40
sorted side 30
by one
20
element.
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
Sorted side Unsorted side
70
• The process 60
continues... Smallest
50 from
40 unsorted
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
Sorted side Unsorted side
70
• The process 60
continues... 50
40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
Sorted side
is bigger Sorted side Unsorted side
70
• The process 60
continues... 50
40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
• The process Sorted side Unsorted side
keeps adding 70
one more 60
number to the 50
sorted side. 40
• The sorted side 30
has the smallest 20
numbers, 10
arranged from 0
small to large. [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
• We can stop Sorted side Unsorted sid
when the 70
unsorted side 60
has just one 50
number, since 40
that number 30
must be the 20
largest number.
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Selection Sort Algorithm
• The array is
now sorted. 70
• We repeatedly 60
selected the 50
smallest 40
element, and 30
moved this 20
element to the 10
front of the 0
unsorted side. [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
template <class Item>
void selection_sort(Item data[ ], size_t n)
{
size_t i, j, smallest;
Item temp;
side starts 60
• The sorted 70
side grows 60
by taking the 50
front 40
element 30
from the 20
unsorted 10
side... 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Insertion Sort Algorithm
Sorted side Unsorted side
• ...and 70
inserting it 60
in the place 50
that keeps 40
the sorted 30
side 20
arranged 10
from small 0
[1] [2] [3] [4] [5] [6]
to large. [0] [1] [2] [3] [4] [5]
The Insertion Sort Algorithm
Sorted side Unsorted side
70
60
50
40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Insertion Sort Algorithm
Sorted side Unsorted side
• Sometimes 70
we are lucky 60
inserted item 40
doesn't need 30
to move at 20
all. 10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Insertionsort Algorithm
Sorted side Unsorted side
• Sometimes 70
we are lucky 60
twice in a 50
row. 40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
Copy the Sorted side Unsorted side
new element 70
to a separate
60
location.
50
40
30
20
10
0
[3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
Shift
elements in 70
the sorted
60
side,
50
creating an
40
open space
30
for the new
20
element.
10
0
[3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
Shift
elements in 70
the sorted
60
side,
50
creating an
40
open space
30
for the new
20
element.
10
0
[3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
Continue
shifting 70
elements...
60
50
40
30
20
10
0
[3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
Continue
shifting 70
elements...
60
50
40
30
20
10
0
[3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
...until you
reach the 70
location for
60
the new
50
element.
40
30
20
10
0
[3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
Copy the Sorted side Unsorted sid
new element 70
back into the
60
array, at the
50
correct
40
location.
30
20
10
0
[3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
How to Insert One Element
• The last Sorted side Unsorted sid
element 70
must also be 60
inserted. 50
Start by 40
copying it... 30
20
10
0
[2] [3] [4] [5] [6] [1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
Sorted Result
70
60
50
40
30
20
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
template <class Item>
void insertion_sort(Item data[ ], size_t n)
{
size_t i, j;
Item temp;
data[j] = temp;
}
}
Insertion Sort Time Analysis
• In O-notation, what is:
– Worst case running time for n items?
– Average case running time for n items?
• Steps of algorithm:
for i = 1 to n-1
take next key from unsorted part of array
insert in appropriate location in sorted part of array:
for j = i down to 0,
shift sorted elements to the right if key > key[i]
increase size of sorted array by 1
Insertion Sort Time Analysis
• In O-notation, what is:
– Worst case running time for n items?
– Average case running time for n items?
• Steps of algorithm:
for i = 1 to n-1 Outer loop:
take next key from unsorted part of array O(n)
insert in appropriate location in sorted part of array:
for j = i down to 0,
shift sorted elements to the right if key > key[i]
increase size of sorted array by 1
Insertion Sort Time Analysis
• In O-notation, what is:
– Worst case running time for n items?
– Average case running time for n items?
• Steps of algorithm:
for i = 1 to n-1 Outer loop:
take next key from unsorted part of array O(n)
insert in appropriate location in sorted part of array:
for j = i down to 0, Inner loop:
shift sorted elements to the right if key > key[i] O(n)
increase size of sorted array by 1
template <class Item>
void insertion_sort(Item data[ ], size_t n)
{
size_t i, j;
Item temp;
data[j] = temp;
}
}
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Swap? 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Yes! 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Swap? 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Swap? 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Swap? 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Yes! 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Swap? 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• The Bubble
Sort algorithm 70
looks at pairs 60
of entries in 50
the array, and 40
swaps their 30
order if 20
needed.
10
Yes! 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Repeat.
70
60
50
40
30
20
10
Swap? No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Repeat.
70
60
50
40
30
20
10
Swap? No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Repeat.
70
60
50
40
30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Repeat.
70
60
50
40
30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Repeat.
70
60
50
40
30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Repeat.
70
60
50
40
30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Repeat.
70
60
50
40
30
20
10
Swap? No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Loop over
array n-1 70
times, 60
swapping pairs 50
of entries as 40
needed. 30
20
10
Swap? No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Loop over
array n-1 70
times, 60
swapping pairs 50
of entries as 40
needed. 30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Loop over
array n-1 70
times, 60
swapping pairs 50
of entries as 40
needed. 30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Loop over
array n-1 70
times, 60
swapping pairs 50
of entries as 40
needed. 30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Loop over
array n-1 70
times, 60
swapping pairs 50
of entries as 40
needed. 30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Loop over
array n-1 70
times, 60
swapping pairs 50
of entries as 40
needed. 30
20
10
Swap? No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Loop over
array n-1 70
times, 60
swapping pairs 50
of entries as 40
needed. 30
20
10
Swap? No. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
The Bubble Sort Algorithm
• Continue
looping, until 70
done. 60
50
40
30
20
10
Swap? Yes. 0
[1]
[0] [2]
[1] [3]
[2] [4]
[3] [5]
[4] [6]
[5]
template <class Item>
void bubble_sort(Item data[ ], size_t n)
{
size_t i, j;
Item temp;