05-Elementary Sorts
05-Elementary Sorts
und Algorithmen
Elementary Sorts
2.1 E LEMENTARY S ORTS
h tt p : / / a l g s 4 . c s . p r i n c e t o n . e d u
2
Sorting problem
Chen 3 A 991-878-4944 308 Blair
3
Sorting problem
Chen 3 A 991-878-4944 308 Blair
Library numbers
contacts
FedEx packages
Selection.sort(a) 0.460954145685913
for i in range(N): 0.5340026311350087
print(a[i]) 0.7216129793703496
0.9003500354411443
0.9293994908845686
5
G: Sort any type of data
Ex 2. Sort strings in alphabetical order.
import DSA, Selection
a = DSA.stdReadAllStrings()
Selection.sort(a)
for e in a:
print(e)
% cat words3.txt
bed bug dad yet zoo ... all bad yes
6
G: Sort any type of data
Ex 3. Sort the les in a given directory by lename.
% python3 FileSorter.py .
DSA.py (size: 2783 bytes)
import sys Date.py (size: 556 bytes)
import DSA, Selection
Experiment.py (size: 182 bytes)
FileSorter.py (size: 104 bytes)
a = DSA.readFiles(sys.argv[1])
Selection.sort(a) Insertion.py (size: 184 bytes)
for e in a: Selection.py (size: 187 bytes)
print(e) ShellSort.py (size: 293 bytes)
Shuffle.py (size: 231 bytes)
ShuffleTest.py (size: 604 bytes)
StringSorter.py (size: 90 bytes)
7
fi
fi
Total order
8
fi
Strict Total order
9
fi
Examples
10
Counterexamples
• No transitivity. Rock-paper-scissors.
COS 126
11
Python Sort
12
Roadmap
client
import DSA, Selection
a = DSA.stdReadAllStrings()
Selection.sort(a)
for e in a:
print(e)
13
Roadmap
client
import DSA, Selection
a = DSA.stdReadAllStrings()
Selection.sort(a)
for e in a:
print(e)
Python)
def __lt__(self, other):
# ...
13
Roadmap
client data-type implementation
import DSA, Selection class Date:
def __init__(self, d, m, y):
a = DSA.stdReadAllStrings() self.d = d
Selection.sort(a) self.m = m
for e in a: self.y = y
print(e)
# ...
Python)
def __lt__(self, other):
# ...
13
Roadmap
client data-type implementation
import DSA, Selection class Date:
def __init__(self, d, m, y):
a = DSA.stdReadAllStrings() self.d = d
Selection.sort(a) self.m = m
for e in a: self.y = y
print(e)
# ...
sort implementation
def sort(a):
N = len(a)
Comparable Function (automatically called by Python) for i in range(N):
min = i
Python)
def __lt__(self, other): for j in range(i+1,N):
# ... if a[j] < a[min]:
min = j
exch(a, i, min)
13
Comparable API
Implement __lt__(self, other) so that:
• De nes a total order.
• Returns true if self is less than other.
self other
self other
other self
less than (return True) equal to (return False) greater than (return False)
14
fi
Implementing the
"Less-Than" Function
class Date:
def __init__(self, d, m, y):
self.d = d
self.m = m
self.y = y
15
Elementary Sorts
Selection Sort
Selection Sort
18
fi
Selection sort demo
initial
19
fi
Selection sort demo
remaining entries
20
fi
Selection sort demo
i min
remaining entries
21
fi
Selection sort demo
i min
remaining entries
22
fi
Selection sort demo
23
fi
fi
Selection sort demo
i min
24
fi
fi
Selection sort demo
i min
25
fi
fi
Selection sort demo
26
fi
fi
Selection sort demo
i min
27
fi
fi
Selection sort demo
i min
28
fi
fi
Selection sort demo
29
fi
fi
Selection sort demo
i min
30
fi
fi
Selection sort demo
i min
31
fi
fi
Selection sort demo
32
fi
fi
Selection sort demo
i min
33
fi
fi
Selection sort demo
i min
34
fi
fi
Selection sort demo
35
fi
fi
Selection sort demo
i min
36
fi
fi
Selection sort demo
i min
37
fi
fi
Selection sort demo
38
fi
fi
Selection sort demo
i min
39
fi
fi
Selection sort demo
i min
40
fi
fi
Selection sort demo
41
fi
fi
Selection sort demo
i min
42
fi
fi
Selection sort demo
i min
43
fi
fi
Selection sort demo
i min
43
fi
fi
Selection sort demo
44
fi
fi
Selection sort demo
i min
45
fi
fi
Selection sort demo
i min
46
fi
fi
Selection sort demo
i min
46
fi
fi
Selection sort demo
in nal order
47
fi
fi
Selection sort demo
sorted
48
fi
Selection sort:
Gypsy folk dance
https://www.youtube.com/watch?v=Ns4TPTC8whw
49
Selection sort
• Algorithm: ↑ scans from left to right.
• Invariants:
↑
in nal order
51
fi
fi
Little Helper
Exchange: Swap item in array a[] at index i with the one at index j.
52
Selection sort inner loop
To maintain algorithm invariants:
in nal order ↑
53
fi
Selection sort inner loop
To maintain algorithm invariants:
in nal order ↑
53
fi
fi
Selection sort inner loop
To maintain algorithm invariants:
in nal order ↑
in nal order ↑ ↑
53
fi
fi
fi
Python Implementation
def exch(a, i, j):
t = a[i]
a[i] = a[j]
a[j] = t
def sort(a):
N = len(a)
for i in range(N):
min = i
for j in range(i+1,N):
if a[j] < a[min]:
min = j
exch(a, i, min)
54
20 random items
algorithm position
in nal order
not in nal order
http://www.sorting-algorithms.com/selection-sort
55
fi
fi
20 random items
algorithm position
in nal order
not in nal order
http://www.sorting-algorithms.com/selection-sort
55
fi
fi
20 partially-sorted items
algorithm position
in nal order
not in nal order
http://www.sorting-algorithms.com/selection-sort
56
fi
fi
20 partially-sorted items
algorithm position
in nal order
not in nal order
http://www.sorting-algorithms.com/selection-sort
56
fi
fi
Analysis
a[]
entries in black
i min 0 1 2 3 4 5 6 7 8 9 10 are examined to find
the minimum
S O R T E X A M P L E
0 6 S O R T E X A M P L E
entries in red
1 4 A O R T E X S M P L E are a[min]
2 10 A E R T O X S M P L E
3 9 A E E T O X S M P L R
4 7 A E E L O X S M P T R
5 7 A E E L M X S O P T R
6 8 A E E L M O S X P T R
7 10 A E E L M O P X S T R
8 8 A E E L M O P R S T X
entries in gray are
9 9 A E E L M O P R S T X in final position
10 10 A E E L M O P R S T X
A E E L M O P R S T X
57
Analysis
• Proposition: Selection sort uses
(N – 1) + (N – 2) + ... + 1 + 0 ~ 1/2 N 2 compares and N
exchanges.
• Running time insensitive to input. Quadratic time, even
if input is sorted.
• Data movement is minimal. Linear number of
exchanges.
58
Insertion Sort
Insertion Sort
60
Insertion sort demo
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
j i
sorted
https://www.youtube.com/watch?v=ROalU379l3U
101
Invariants
• Entries to the left of ↑ (including ↑) are in
ascending order.
• Entries to the right of ↑ have not yet been seen.
103
Insertion sort inner loop
To maintain algorithm invariants:
104
Insertion sort inner loop
To maintain algorithm invariants:
def sort(a):
N = len(a)
for i in range(N):
for j in range(i,0,-1):
if a[j] < a[j-1]:
exch(a, j, j-1)
else:
break
105
40 random items
algorithm position
in order
not yet seen
http://www.sorting-algorithms.com/insertion-sort
106
40 random items
algorithm position
in order
not yet seen
http://www.sorting-algorithms.com/insertion-sort
106
40 reverse-sorted items
algorithm position
in order
not yet seen
http://www.sorting-algorithms.com/insertion-sort
107
40 reverse-sorted items
algorithm position
in order
not yet seen
http://www.sorting-algorithms.com/insertion-sort
107
40 partially-sorted items
algorithm position
in order
not yet seen
http://www.sorting-algorithms.com/insertion-sort
108
40 partially-sorted items
algorithm position
in order
not yet seen
http://www.sorting-algorithms.com/insertion-sort
108
Analysis
109
Analysis
a[]
i j 0 1 2 3 4 5 6 7 8 9 10
S O R T E X A M P L E entries in gray
do not move
1 0 O S R T E X A M P L E
2 1 O R S T E X A M P L E
3 3 O R S T E X A M P L E
4 0 E O R S T X A M P L E entry in red
is a[j]
5 5 E O R S T X A M P L E
6 0 A E O R S T X M P L E
7 2 A E M O R S T X P L E
entries in black
8 4 A E M O P R S T X L E moved one position
9 2 A E L M O P R S T X E right for insertion
10 2 A E E L M O P R S T X
A E E L M O P R S T X
110
111
Best Case
If the array is in ascending order, insertion
sort makes N – 1 compares and 0 exchanges.
A E E L M O P R S T X
112
Worst Case
If the array is in descending order (and no duplicates),
insertion sort makes ~ ½ N 2 compares and
~ ½ N 2 exchanges.
X T S R P O M L E E A
113
Partially-sorted arrays
Def.: An inversion is a pair of keys that are
out of order.
A E E L M O T R X P S
114
Partially-sorted arrays
• Def.: An array is partially sorted if the number of
inversions is ≤ c N.
115
Partially-sorted arrays
116
Practical improvements
Half exchanges:
• Shift items over (instead of exchanging)
• Eliminates unnecessary data movement.
• No longer uses only __lt__() and exch()
to access data.
A C H H I M N N P Q X Y K B I N A R Y
117
Practical improvements
Half exchanges:
• Shift items over (instead of exchanging)
• Eliminates unnecessary data movement.
• No longer uses only __lt__() and exch()
to access data.
A C H H I M N N P Q X Y B I N A R Y
117
Practical improvements
Half exchanges:
• Shift items over (instead of exchanging)
• Eliminates unnecessary data movement.
• No longer uses only __lt__() and exch()
to access data.
A C H H I M N N P Q X Y B I N A R Y
117
Practical improvements
Half exchanges:
• Shift items over (instead of exchanging)
• Eliminates unnecessary data movement.
• No longer uses only __lt__() and exch()
to access data.
A C H H I M N N P Q X Y B I N A R Y
117
Practical improvements
Half exchanges:
• Shift items over (instead of exchanging)
• Eliminates unnecessary data movement.
• No longer uses only __lt__() and exch()
to access data.
A C H H I K M N N P Q X Y B I N A R Y
117
Practical improvements
Binary insertion sort:
• Use binary search to nd insertion point.
• Number of compares ~ N lg N .
• But still a quadratic number of array accesses.
A C H H I M N N P Q X Y K B I N A R Y
118
fi
Practical improvements
Binary insertion sort:
• Use binary search to nd insertion point.
• Number of compares ~ N lg N .
• But still a quadratic number of array accesses.
A C H H I M N N P Q X Y K B I N A R Y
118
fi
fi
Practical improvements
Binary insertion sort:
• Use binary search to nd insertion point.
• Number of compares ~ N lg N .
• But still a quadratic number of array accesses.
A C H H I M N N P Q X Y K B I N A R Y
118
fi
fi
Shellsort
h-Sorting
Idea: Move entries more than one position at
a time by h-sorting the array.
an h-sorted array is h interleaved sorted subsequences
h=4
L E E A M H L E P S O L T S X R
L M P T
E H S S
E L O X
A E L R
h = 13
P H E L L S O R T E X A M S L E
h-sorted:
P for each i, a[i] <= a[i+h]
S
H L
E E 120
h-sorting demo
h-sorting demo
122
h-sorting demo
j i
123
h-sorting demo
j i
124
h-sorting demo
125
h-sorting demo
j i
126
h-sorting demo
j i
127
h-sorting demo
128
h-sorting demo
j i
129
h-sorting demo
130
h-sorting demo
j i
131
h-sorting demo
j i
132
h-sorting demo
j i
133
h-sorting demo
134
h-sorting demo
j i
135
h-sorting demo
136
h-sorting demo
j i
137
h-sorting demo
j i
138
h-sorting demo
3-sorted
139
h-sorting demo
3-sorted
140
h-sorting demo
3-sorted
141
h-sorting demo
3-sorted
142
Shellsort [Shell 1959]
input S H E L L S O R T E X A M P L E
13-sort P H E L L S O R T E X A M S L E
4-sort L E E A M H L E P S O L T S X R
1-sort A E E E H L L L M O P R S S T X
143
How to h-sort an array?
Insertion sort, with stride length h.
M O L E E X A S P R T
E O L M E X A S P R T
E E L M O X A S P R T
E E L M O X A S P R T
A E L E O X M S P R T
A E L E O X M S P R T
A E L E O P M S X R T
A E L E O P M S X R T
A E L E O P M S X R T
A E L E O P M S X R T
145
Shellsort example: increments 7, 3, 1
input
S O R T E X A M P L E
7-sort
S O R T E X A M P L E
M O R T E X A S P L E
M O R T E X A S P L E
M O L T E X A S P R E
M O L E E X A S P R T
145
Shellsort example: increments 7, 3, 1
input
S O R T E X A M P L E
7-sort
S O R T E X A M P L E
M O R T E X A S P L E
M O R T E X A S P L E
M O L T E X A S P R E
M O L E E X A S P R T
3-sort
M O L E E X A S P R T
E O L M E X A S P R T
E E L M O X A S P R T
E E L M O X A S P R T
A E L E O X M S P R T
A E L E O X M S P R T
A E L E O P M S X R T
A E L E O P M S X R T
A E L E O P M S X R T
145
Shellsort example: increments 7, 3, 1
input
S O R T E X A M P L E
7-sort
1-sort
S O R T E X A M P L E
M O R T E X A S P L E A E L E O P M S X R T
M O R T E X A S P L E A E L E O P M S X R T
M O L T E X A S P R E A E L E O P M S X R T
M O L E E X A S P R T A E E L O P M S X R T
A E E L O P M S X R T
3-sort
A E E L O P M S X R T
M O L E E X A S P R T A E E L M O P S X R T
E O L M E X A S P R T A E E L M O P S X R T
E E L M O X A S P R T A E E L M O P S X R T
E E L M O X A S P R T A E E L M O P R S X T
A E L E O X M S P R T A E E L M O P R S T X
A E L E O X M S P R T
A E L E O P M S X R T
A E L E O P M S X R T
A E L E O P M S X R T
145
Shellsort example: increments 7, 3, 1
input
S O R T E X A M P L E
7-sort
1-sort
S O R T E X A M P L E
M O R T E X A S P L E A E L E O P M S X R T
M O R T E X A S P L E A E L E O P M S X R T
M O L T E X A S P R E A E L E O P M S X R T
M O L E E X A S P R T A E E L O P M S X R T
A E E L O P M S X R T
3-sort
A E E L O P M S X R T
M O L E E X A S P R T A E E L M O P S X R T
E O L M E X A S P R T A E E L M O P S X R T
E E L M O X A S P R T A E E L M O P S X R T
E E L M O X A S P R T A E E L M O P R S X T
A E L E O X M S P R T A E E L M O P R S T X
A E L E O X M S P R T
A E L E O P M S X R T
A E L E O P M S X R T result
A E L E O P M S X R T A E E L M O P R S T X
145
Python Implementation
def sort(a):
3x+1 increment
N = len(a)
sequence
h = 1
while h < N//3: h = 3*h+1 # 1, 4, 13, 40, 121, 364, ...
h = h//3 increment
146
input
Visual Trace
40-sorted
13-sorted
4-sorted
result
147
50 random items
algorithm position
h-sorted
current subsequence
http://www.sorting-algorithms.com/shell-sort other elements
148
50 random items
algorithm position
h-sorted
current subsequence
http://www.sorting-algorithms.com/shell-sort other elements
148
50 partially-sorted items
algorithm position
h-sorted
current subsequence
http://www.sorting-algorithms.com/shell-sort other elements
149
50 partially-sorted items
algorithm position
h-sorted
current subsequence
http://www.sorting-algorithms.com/shell-sort other elements
149
Shellsort:
Hungarian (Sz kely) folk dance
https://www.youtube.com/watch?v=CmPA7zE8mx0 150
é
Which increment sequence to use?
• Powers of two. 1, 2, 4, 8, 16, 32, ...
No.
152
Which increment sequence to use?
153
Which increment sequence to use?
153
Intuition
Proposition: An h-sorted array remains h-sorted after g-sorting it.
7-sort 3-sort
S O R T E X A M P L E M O L E E X A S P R T
M O R T E X A S P L E E O L M E X A S P R T
M O R T E X A S P L E E E L M O X A S P R T
M O L T E X A S P R E E E L M O X A S P R T
M O L E E X A S P R T A E L E O X M S P R T
A E L E O X M S P R T
A E L E O P M S X R T
A E L E O P M S X R T
A E L E O P M S X R T
A E L E O P M S X R T
154
Analysis
• Proposition: The order of growth of the worst-case number of compares used by
shellsort with the 3x+1 increments is N 3/2.
• Property: The expected number of compares to shellsort a randomly-ordered array
using 3x+1 increments is….
155
Why are we interested in shellsort?
Useful in practice.
• Fast unless array size is huge
(used for small subarrays).
• Tiny, xed footprint for code
(used in some embedded systems).
• Hardware sort prototype.
156
fi
Why are we interested in shellsort?
Useful in practice.
• Fast unless array size is huge
(used for small subarrays).
R, bzip2, /linux/kernel/groups.c
156
fi
Why are we interested in shellsort?
Simple algorithm, nontrivial performance,
interesting questions.
• Asymptotic growth rate?
• Best sequence of increments?
• Average-case performance?
increment sequence
equally likely
159
fl
How to shuf e an array?
Goal. Rearrange array so that result is a
uniformly random permutation.
all permutations
equally likely
160
fl
Shuf e sort
1. Generate a random real number for each array entry.
2. Sort the array.
161
fl
Shuf e sort
1. Generate a random real number for each array entry.
2. Sort the array.
161
fl
Shuf e sort
1. Generate a random real number for each array entry.
2. Sort the array.
162
fl
Shuf e sort
1. Generate a random real number for each array entry.
2. Sort the array.
163
fl
fl
Shuf ing done wrong
Microsoft antitrust probe by EU. Microsoft agreed to
provide a randomized ballot screen for users to select
browser in Windows 7.
appeared last
164
fl
fl
Shuf ing done wrong
Microsoft antitrust probe by EU. Microsoft agreed to
provide a randomized ballot screen for users to select
browser in Windows 7.
Solution? Implement shuf e sort by making comparator
always return a random answer.
164
fl
fl
Knuth shuf e demo
165
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
166
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
i r
167
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
i r
168
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
i r
168
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
169
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
170
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
171
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
172
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
173
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
174
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
175
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
176
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
177
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
178
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
179
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
180
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
181
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
182
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
183
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
184
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
185
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
186
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
187
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
188
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
189
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
189
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
190
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
shuf ed
191
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
r i
shuf ed
192
fl
fl
Knuth shuf e
• In iteration i, pick integer r between 0 and i uniformly at random.
• Swap a[i] and a[r].
shuf ed
193
fl
fl
Knuth Shuf e
random
194
fl
fl
Knuth Shuf e
• In iteration i, pick integer r between 0
and i uniformly at random.
• Swap a[i] and a[r]. common bug: between 0 and N – 1
def shuffle(a):
N = len(a)
for i in range(N): between 0 and i
r = random.randint(0, i)
exch(a, i, r)
195
fl
Broken Knuth shuf e
Q. What happens if integer is chosen between 0 and N-1 ?
A. Not uniformly random!
196
fl
fl
fl
Shuf ing done wrong 2
Texas hold'em poker. Software must shuf e electronic cards.
http://www.datamation.com/entdev/article.php/616221
197
fl
fl
for i := 1 to 52 do begin
r := random(51) + 1; between 1 and 51
Shuf ing algorithm in FAQ at
swap := card[r];
www.planetpoker.com
card[r] := card[i];
card[i] := swap;
end;
• Bug 1: Random number r never 52 52nd card can't end up in 52nd place.
198
fl
fl
fl
fl
for i := 1 to 52 do begin
r := random(51) + 1; between 1 and 51
Shuf ing algorithm in FAQ at
swap := card[r];
www.planetpoker.com
card[r] := card[i];
card[i] := swap;
end;
• Bug 1: Random number r never 52 52nd card can't end up in 52nd place.
selection sort N2 N2 N2
insertion sort N N2 N2
selection sort N2 N2 N2
insertion sort N N2 N2
2.2 M ERGESORT
h tt p : / / a l g s 4 . c s . p r i n c e t o n . e d u
201