# ID1020:Enkel Sortering

```ID1020:Enkel Sortering
Dr. Jim Dowling
[email protected]
kap 2.1
Slides adapted from Algorithms 4th Edition, Sedgewick.
Ett sorteringsproblem
• T.ex. Student poster p&aring; ett universitet.
post
nyckel
Chen
3
A
991-878-4944
308 Blair
Rohde
2
A
232-343-5555
343 Forbes
Gazsi
4
B
766-093-9873
101 Brown
Furia
1
A
766-093-9873
101 Brown
Kanaga
3
B
898-122-9643
22 Brown
Andrews
3
A
664-480-0023
097 Little
Battle
4
C
874-088-1212
121 Whitman
• Sortering. Ordna om en array (f&ouml;ljd) av N poster i stigande ordning.
Andrews
3
A
664-480-0023
097 Little
Battle
4
C
874-088-1212
121 Whitman
Chen
3
A
991-878-4944
308 Blair
Furia
1
A
766-093-9873
101 Brown
Gazsi
4
B
766-093-9873
101 Brown
Kanaga
3
B
898-122-9643
22 Brown
Rohde
2
A
232-343-5555
343 Forbes
2
Sortering applikationer
Library of Congress numbers
contacts
FedEx packages
playing cards
3
Exempel: sortering klient (1)
• M&aring;l. Sortera alla m&ouml;jliga datatyper.
• T.ex.1. Sortera slumpm&auml;ssiga reella tal i stigande ordning.
ett exempel kommer senare…
public class Experiment
{
public static void main(String[] args)
{
int N = Integer.parseInt(args[0]);
Double[] a = new Double[N];
for (int i = 0; i &lt; N; i++)
a[i] = StdRandom.uniform();
Insertion.sort(a);
for (int i = 0; i &lt; N; i++)
StdOut.println(a[i]);
}
}
% java Experiment 10
0.08614716385210452
0.09054270895414829
0.10708746304898642
0.21166190071646818
0.363292849257276
0.460954145685913
0.5340026311350087
0.7216129793703496
0.9003500354411443
0.9293994908845686
4
Exempel: sortering klient (2)
• M&aring;l. Sortera alla m&ouml;jliga datatyper.
• T.ex. 2. Sortera alla str&auml;ngar i bokstavsordning.
public class StringSorter {
public static void main(String[] args)
{
Insertion.sort(a);
for (int i = 0; i &lt; a.length; i++)
StdOut.println(a[i]);
}
}
% more words3.txt
% java StringSorter &lt; words3.txt
5
Exempel: sortering klient (3)
• M&aring;l. Sortera alla m&ouml;jliga datatyper.
• T.ex. 3. Sortera alla filer i en given mapp efter filnamn.
% java FileSorter .
import java.io.File;
Insertion.class
public class FileSorter
{
public static void main(String[] args)
{
File directory = new File(args[0]);
File[] files = directory.listFiles();
Insertion.sort(files);
for (int i = 0; i &lt; files.length; i++)
StdOut.println(files[i].getName());
}
}
Insertion.java
InsertionX.class
InsertionX.java
Selection.class
Selection.java
Shell.class
Shell.java
ShellX.class
ShellX.java
6
Totalordning
• M&aring;l. Sortera alla m&ouml;jliga datatyper (d&auml;r sortering &auml;r v&auml;ldefinierade).
• En totalordning &auml;r en bin&auml;rrelation ≤ som satisfierar:
- icke-symmetri: IF (v ≤ w och w ≤ v) THEN v = w.
- transitiv: IF (v ≤ w och w ≤ x) THEN v ≤ x.
- totalitet: antingen v ≤ w eller w ≤ v eller b&aring;de.
• T.ex.
- Vanlig ordningen f&ouml;r heltal och reella tal.
- Kronologiska ordningen f&ouml;r datum och tider.
- Bokstavsordning f&ouml;r str&auml;ngar.
• Icke-transitive. Sten-sax-p&aring;se.
7
Callbacks (&aring;teranropsfunktion)
• M&aring;l. Sortera alla m&ouml;jliga datatyper (d&auml;r sortering &auml;r v&auml;ldefinierade).
• Hur kan sort() veta hur den ska j&auml;mf&ouml;ra data av olika typer, som Double,
String, and java.io.File, utan att ha n&aring;gon information om datatypen av
postens nyckel?
• Callback = en referens till exekverbarkod.
- Klienen skickar en array av objekt till sort() funktionen.
- sort() funktionen anropar objekts compareTo() metod vid behov.
• Att implementera callbacks.
- Java: interfaces.
- C: function pointers.
- C++: class-type functors.
- C#: delegates.
- Python, Perl, ML, Javascript: first-class functions.
8
Callbacks i Java
klient
datatyp implementation
public class StringSorter
{
public static void main(String[] args)
{
Insertion.sort(a);
for (int i = 0; i &lt; a.length; i++)
StdOut.println(a[i]);
}
}
Comparable interface (inbyggd i Java)
public interface Comparable&lt;Item&gt;
{
public int compareTo(Item that);
}
inga beroenden
p&aring; String datatypen
public class String
implements Comparable&lt;String&gt;
{
...
public int compareTo(String b)
{
...
return -1;
...
return +1;
...
return 0;
}
}
sort implementation
public static void sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i &lt; N; i++)
for (int j = i; j &gt; 0; j--)
if (a[j].compareTo(a[j-1]) &lt; 0)
exch(a, j, j-1);
else break;
}
9
Comparable API
• Implementera compareTo() s&aring; att v.compareTo(w):
- definierar en totalordning;
- returnerar en negativ heltal, noll, eller en positiv heltal
IF v &auml;r respektiv mindre &auml;n, lika med, eller st&ouml;rre &auml;n w.
- kastar en exception om typer &auml;r inkompatibla typer (eller om en av dem &auml;r
null).
v
w
mindre &auml;n (returnera -1)
v
w
lika med (returnera 0)
w
v
st&ouml;rre &auml;n (returnera +1)
• Inbyggda j&auml;mf&ouml;rbara typer. Integer, Double, String, Date, File, ...
• Anv&auml;nder-definierade j&auml;mf&ouml;rbara typer. Implementera Comparable
interface:n och instanser av klassen (objekt) kan j&auml;mf&ouml;ras med compareTo
metoden.
10
Implementera Comparable interface:n
• Date datatyp. F&ouml;renklad version av java.util.Date.
public class Date implements Comparable&lt;Date&gt;{
private final int month, day, year;
public Date(int m, int d, int y)
month = m;
day
= d;
year = y;
}
public int compareTo(Date that)
if (this.year &lt; that.year )
if (this.year &gt; that.year )
if (this.month &lt; that.month)
if (this.month &gt; that.month)
if (this.day
&lt; that.day )
if (this.day
&gt; that.day )
return 0;
}
{
j&auml;mf&ouml;r Date objekt bara
med andra Date objekt
{
return
return
return
return
return
return
-1;
+1;
-1;
+1;
-1;
+1;
}
11
Enkel sortering (elementary sorting)
Selection sort (urvalssortering) algoritm demo
• Under iteration i, hitta index min av den minste resterande post.
• a[i] och a[min] byter plats.
initial
14
Selection sort algoritm
• Algoritm. ↑ skannar fr&aring;n v&auml;nster till h&ouml;ger.
• Invarianter.
- Poster till v&auml;nster av ↑ (inkluderande ↑ ) &auml;r sorterad i stigande ordning.
- Ingen post till h&ouml;ger av ↑ &auml;r mindre &auml;n en post till v&auml;nster av ↑.
i slutordning
↑
15
Tv&aring; anv&auml;ndbara sorterings hj&auml;lpfunktioner
• Hj&auml;lpfunktioner. J&auml;mf&ouml;relser och byte operationer p&aring; poster (objekt).
• Mindre &auml;n (less-than). &Auml;r posten (objekt) v mindre &auml;n w ?
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) &lt; 0;
}
• Byte (exchange). Byt posten i array a[] vid index j med posten vid index k.
private static void exch(Comparable[] a, int j, int k)
{
Comparable swap = a[j];
a[j] = a[k];
a[k] = swap;
}
16
Selection sort innre slingan
• F&ouml;r att bevara algoritmen invarianter:
- Flytta pekare till h&ouml;ger.
i++;
- Identifiera indexet av minsta posten till h&ouml;ger
i array:n.
int min = i;
for (int j = i+1; j &lt; N; j++) {
if (less(a[j], a[min])) {
min = j;
}
}
i slutordning
i slutordning
↑
↑
↑
- Byt indexet i med min, det minsta elementet.
exch(a, i, min);
i slutordning
↑

↑
17
Selection sort: Java implementation
public class Selection {
public static void sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i &lt; N; i++)
{
int min = i;
for (int j = i+1; j &lt; N; j++)
if (less(a[j], a[min]))
min = j;
exch(a, i, min);
}
}
private static boolean less(Comparable v, Comparable w)
{ /* as before */ }
private static void exch(Comparable[] a, int i, int j)
{ /* as before */ }
}
18
Selection sort: animeringar
20 poster i slumpordning
algoritm position
http://www.sorting-algorithms.com/selection-sort
19
Selection sort: animeringar
algoritm position
http://www.sorting-algorithms.com/selection-sort
20
Matematisk analys
• Vi anv&auml;nder f&ouml;ljande kostnadsmodellen med de enkla
sorteringsalgoritmerna:
1.
2.
antalet j&auml;mf&ouml;relser (comparisons)
antalet byten (exchanges)
• Om algoritmen inte swappar element, d&aring; r&auml;knar vi antalet array
accesser.
Selection sort: matematisk analys
• Sats. Selection sort j&auml;mf&ouml;r (N -1) + (N - 2) + ... + 1 + 0 ~ N 2 / 2 g&aring;nger och byter N
g&aring;nger.
• K&ouml;rtiden &auml;r inte k&auml;nslig mot indata. Kvadratisk tid, &auml;ven om input &auml;r sorterad.
• Minimera kopieringen av data. Linj&auml;r antal byte.
2
Insertion Sort (Ins&auml;ttningssortering)
Insertion sort demo
• Under iteration i, a[i] byter plats med varje post som &auml;r st&ouml;rre p&aring; v&auml;nstra
sidan.
24
Insertion sort
• Algoritm. ↑ skannar fr&aring;n v&auml;nster till h&ouml;ger.
• Invarianter.
- Poster till v&auml;nster om ↑ (inkluderande ↑) &auml;r i stigande ordning.
- Poster till h&ouml;ger om ↑ har inte bearbetats &auml;n.
↑
inte bearbetat &auml;n
25
Insertion sort inner loop
• Bevara algoritm invarianterna:
- Flytta pekare till h&ouml;ger.
i++;
↑
• N&auml;r pekare flyttar fr&aring;n h&ouml;ger till v&auml;nster,
byt a[i] med varje post p&aring; v&auml;nstra
sidan som &auml;r st&ouml;rre.
for (int j = i; j &gt; 0; j--)
if (less(a[j], a[j-1]))
exch(a, j, j-1);
else break;
↑ ↑ ↑ ↑
26
Insertion sort: Java implementation
public class Insertion {
public static void sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i &lt; N; i++) {
for (int j = i; j &gt; 0; j--) {
if (less(a[j], a[j-1])) {
exch(a, j, j-1);
} else {
break;
}
}
}
}
private static boolean less(Comparable v, Comparable w)
{ /* as before */ }
private static void exch(Comparable[] a, int i, int j)
{ /* as before */ }
}
27
Insertion sort: animering
40 poster i slumpordning
algoritm position
http://www.sorting-algorithms.com/insertion-sort
28
Insertion sort: animering
algoritm position
http://www.sorting-algorithms.com/insertion-sort
29
Insertion sort: animering
algoritm position
http://www.sorting-algorithms.com/insertion-sort
30
Insertion sort: matematisk analys
• Sats. F&ouml;r att sortera en array i slumpordning med unika nycklar,
insertion sort j&auml;mf&ouml;r ~ &frac14; N 2 g&aring;nger och byter ~ &frac14; N 2 g&aring;nger i genomsnitt.
• Bevis. F&ouml;rv&auml;ntat antal platser en post flyttar tillbaka &auml;r N/2 (halvv&auml;gs).
31
Insertion sort: trace
32
Insertion sort: analys
• Best case. Om array:n &auml;r i stigande ordning, insertion sort j&auml;mf&ouml;r
N – 1 g&aring;nger och byter 0 g&aring;nger.
AE ELMOPRSTX
• Worst case. Om array:n &auml;r i nedstigande ordning (med unika element),
insertion sort j&auml;mf&ouml;r ~ &frac12; N 2 g&aring;nger och byter ~ &frac12; N 2 g&aring;nger.
XTS RPOMLF EA
33
• Def. En inversion &auml;r ett par nycklar som &auml;r i fel ordningen.
AE ELMOTRXPS
T-R T-P T-S R-P X-P X-S
(6 inversioner)
• Def. En array &auml;r delvis sorterade om antalet inversionerna &auml;r ≤ c N.
- T.ex. 1. En sorterade array har 0 inversioner.
- T.ex. 2. En subarray av l&auml;ngd 10 lagt till en sorteradea subarray av l&auml;ngd N.
• Sats. F&ouml;r delvis sorterade arrayer, insertion sort k&ouml;r i linj&auml;rtid.
• Bevis. Antalet byten &auml;r lika med antalet inversionerna.
antalet j&auml;mf&ouml;relser = antalet byten + (N – 1)
34
Insertion sort: f&ouml;rb&auml;ttringar
• Bin&auml;r insertion sort. Man kan anv&auml;nda bin&auml;rs&ouml;kning f&ouml;r att hitta den s&aring;kallade ”insertion point”.
- Antalet j&auml;mf&ouml;relser ~ N lg N .
- Men det &auml;r fortfarande kvadratisk i antalet array accesser.
ACH H I MN N PQXYKBINARY
bin&auml;rs&ouml;k efter f&ouml;rsta nyckel &gt; K
35
Shellsort
Shellsort &ouml;versikt
• K&auml;rnid&eacute;n. Vi vill flytta poster mer &auml;n en position &aring;t g&aring;ngen genom att
exekvera h-sorting p&aring; array:n.
• Shellsort. [Shell 1959] h-sort array f&ouml;r nedstigande sekvens av v&auml;rden av h.
37
h-sorting demo
• Vid iteration i, byt a[i] mot denna post som ligger h positioner till v&auml;nster
om denna post &auml;r st&ouml;rre &auml;n a[i].
38
h-sorting
• Hur k&ouml;r man h-sort p&aring; en array?
K&ouml;r insertion sort, men med klivl&auml;ngd (stride length) h.
3-sorting an array
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
• Varf&ouml;r insertion sort?
- Stora inkrement ⇒ small subarray.
- Sm&aring; inkrement ⇒ n&auml;stan sorterad.
39
Shellsort exempel: inkrement av 7, 3, 1
input
S O R T E X A M P L E
1-sort
A E L E O P M S X R T
A E L E O P M S X R T
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 P M S X R T
A E E L O P M S X R T
A E E L O P M S X R T
A E E L O P M S X R T
A E E L M O P S X R T
A E E L M O P S X R T
A E E L M O P S X R T
A E E L M O P R S X T
A E E L M O P R S T X
resultat
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 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
40
Shellsort: Java implementation
public class Shell {
public static void sort(Comparable[] a)
{
int N = a.length;
int h = 1;
while (h &lt; N/3) h = 3*h + 1; // 1, 4, 13, 40, 121, 364, ...
while (h &gt;= 1) { // h-sort the array.
for (int i = h; i &lt; N; i++) {
for (int j = i; j &gt;= h &amp;&amp; less(a[j], a[j-h]); j -= h)
exch(a, j, j-h);
}
h = h/3;
}
}
private static boolean less(Comparable v, Comparable w)
{ /* as before */ }
private static void exch(Comparable[] a, int i, int j)
{ /* as before */ }
}
3x+1 inkrement
sekvens
insertion sort
n&auml;sta inkrement
41
Shellsort: visualisering
42
Shellsort: animering
50 poster i slumpordning
algoritm position
h-sorted
nuvarande subsekvens
http://www.sorting-algorithms.com/shell-sort
andra element
43
Shellsort: animering
algoritm position
h-sorted
nuvarande subsekvens
http://www.sorting-algorithms.com/shell-sort
andra element
44
Shellsort: vilken inkrementsekvens ska man anv&auml;nda?
• Tv&aring;potens (powers of two). 1, 2, 4, 8, 16, 32, ...
Nej.
• Tv&aring;potens minus ett. 1, 3, 7, 15, 31, 63, …
Kanske.
• 3x + 1. 1, 4, 13, 40, 121, 364, …
OK. L&auml;tt att ber&auml;kna.
45
Shellsort: intuition
• Sats. En h-sorted array f&ouml;rbli h-sorted efter ha k&ouml;rt g-sort p&aring; array:n.
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
E O L M E X A
E E L M O X A
E E L M O X A
A E L E O X M
A E L E O X M
A E L E O P M
A E L E O P M
A E L E O P M
A E L E O P M
S P
S P
S P
S P
S P
S P
S X
S X
S X
S X
R
R
R
R
R
R
R
R
R
R
T
T
T
T
T
T
T
T
T
T
still 7-sorted
Utmaning. Bevisa detta faktum; det &auml;r sv&aring;rare &auml;n vad man tror!
46
Shellsort: analys
• Sats. Tidskomplexitet av worst-case &auml;r antalet j&auml;mf&ouml;relser i shellsort. N&auml;r
inkrementet &auml;r 3x+1, d&aring; &auml;r tidskomplexitet lika med N 3/2.
• Egenskap. F&ouml;rv&auml;ntade antalet j&auml;mf&ouml;relser f&ouml;r att k&ouml;ra shellsort p&aring; en array i
slumpordning med inkrementet lika med 3x+1 &auml;r….
N
compares
2.5 N ln N
0.25 N ln 2 N
N 1.3
5,000
93K
106K
91K
64K
10,000
209K
230K
213K
158K
20,000
467K
495K
490K
390K
40,000
1022K
1059K
1122K
960K
80,000
2266K
2258K
2549K
2366K
• Anm&auml;rkning. En noggrann modell har inte hittats &auml;nnu (!)
47
Varf&ouml;r &auml;r shellsort intressant?
• En enkel id&eacute; kan leda till signifikant prestandsf&ouml;rb&auml;ttringar.
R, bzip2, /linux/kernel/groups.c
• Anv&auml;ndbart i praktiken.
- Snabb om array:n inte &auml;r enorm.
- Mycket liten minneskomplexitet (anv&auml;nt i vissa inbyggda system).
uClibc
• Enkel algoritm, icke-trivial prestanda, intressanta fr&aring;gor.
- Asymptotisk tidskomplexitet?
- B&auml;sta m&ouml;jliga sekvens av inkrementet?
&ouml;ppet problem:
- Average-case prestanda?
hitta en b&auml;ttre inkrement sekvens
• L&auml;xa. M&aring;nga bra algoritm har inte uppt&auml;ckts &auml;nnu.
48
Enkel sortering sammanfattning
algoritm
best
average worst
selection sort
N2
N2
N2
insertion sort
N
N2
N2
Shellsort (3x+1)
N log N ?
M&aring;l
N
N 3/2
N log N N log N
Tidskomplexitet av k&ouml;rtiden f&ouml;r att sortera en array av N poster
49
Blandning (Shuffling)
Hur blandar man en array?
• M&aring;l. Ordna om en array s&aring; att resultatet &auml;r en slumpm&auml;ssig valda permutation.
alla permutationer har samma sannolikhet
51
Hur blandar man en array?
• M&aring;l. Ordna om en array s&aring; att resultatet &auml;r en slumpm&auml;ssig valda permutation.
alla permutationer har samma sannolikhet
52
Shuffle sort
• Generera ett slumpm&auml;ssigt reellt tal f&ouml;r varje element i array:n.
• Sortera array:n.
anv&auml;ndbart f&ouml;r att blanda
0.8003
0.9706
0.9157
0.9649
0.1576
0.4854
0.1419
0.4218
0.9572
53
Shuffle sort
• Generera ett slumpm&auml;ssigt reellt tal f&ouml;r varje element i array:n.
• Sortera array:n.
anv&auml;ndbart f&ouml;r att blanda
0.1419
0.1576
0.4218
0.4854
0.8003
0.9157
0.9572
0.9649
0.9706
54
Shuffle sort
- Generera ett slumpm&auml;ssigt reellt tal f&ouml;r varje element i array:n.
- Sortera array:n.
anv&auml;ndbart f&ouml;r att blanda
0.1419
0.1576
0.4218
0.4854
0.8003
0.9157
0.9572
0.9649
0.9706
• Sats. Shuffle sort resulterar i en slumpm&auml;ssig valda permutation (uniformly
random permutation).
Vi antar reella tal valda slumpm&auml;ssigt (och inga oavgjorda)
55
The Microsoft Shuffle
• Microsoft antitrust probe by EU. Microsoft var &ouml;verens om att visa en
slumpm&auml;ssig genererade sk&auml;rm s&aring; att anv&auml;ndare kunde v&auml;lja sin browser i
Windows 7.
http://www.browserchoice.eu
f&ouml;rekom sist
50% av tiden
56
The Microsoft Shuffle
• L&ouml;sningen? Implementera shuffle sort genom att skriva en comparator som
alltid returnera ett slump svar.
public int compareTo(Browser that)
{ Microsofts implementation i Javascript
double r = Math.random();
function
(a,b)
if (rRandomSort
&lt; 0.5) return
-1;
{ if (r &gt; 0.5) return +1;
return
return
(0.5 0;
- Math.random());
}}
browser comparator
(ska implementera en totalordning)
57
Knuth shuffle demo
- Under iteration i, slumpa fram ett heltalr mellan 0 och i.
- Swappaa[i] och a[r].
58
Knuth shuffle
- Under iteration i, slumpa fram ett heltal r mellan 0 och i.
- Swappa a[i] och a[r].
• Sats. [Fisher-Yates 1938] Knuth shuffle sort resulterar i en slumpm&auml;ssig
valda permutation (uniformly random permutation) av input array:n i linj&auml;r
tid.
Vi antar heltal valda slumpm&auml;ssigt
59
Knuth shuffle
- Under iteration i, slumpa fram ett heltal r mellan 0 och i.
- Swappa a[i] och a[r].
vanlig bugg : mellan 0 and N – 1
korrekt variant: mellan i and N – 1
public class StdRandom
{
...
public static void shuffle(Object[] a)
{
int N = a.length;
for (int i = 0; i &lt; N; i++)
{
int r = StdRandom.uniform(i + 1);
exch(a, i, r);
}
}
}
mellan 0 och i
60
Trasig Knuth shuffle
• Vad h&auml;nder om heltalet &auml;r vald mellan 0 och N-1 ?
• Det &auml;r inte slumpm&auml;ssigt l&auml;ngre!
ist&auml;llet f&ouml;r 0 och i
permutation
Knuth shuffle
broken shuffle
ABC
1/6
4/27
ACB
1/6
5/27
BAC
1/6
5/27
BCA
1/6
5/27
CAB
1/6
4/27
CBA
1/6
4/27
sannolikhet av alla resultat n&auml;r man blandar { A, B, C }
61
Online Poker
• Texas hold'em poker. Programmet ska blanda elektroniska kort.
How We Learned to Cheat at Online Poker: A Study in Software Security
http://www.datamation.com/entdev/article.php/616221
62
Online poker anekdot
Shuffling algorithm in FAQ at www.planetpoker.com
for i := 1 to 52 do begin
r := random(51) + 1;
swap := card[r];
card[r] := card[i];
card[i] := swap;
end;
•
•
•
•
Bug
Bug
Bug
Bug
1.
2.
3.
4.
between 1 and 51
Slump tal r aldrig 52 =&gt; 52:de kort kan inte hamna i 52:de platsen.
Blandingen &auml;r inte slumpm&auml;ssig (ska vara mellan 1 och i).
random() anv&auml;nder bara en 32-bit seed =&gt; 232 m&ouml;jliga blandningar.
Seed = millisekunder sedan midnatt =&gt; 86.4 miljon blandningar.
• Exploit. Man kan, efter har set bara 5 kort och synkroniserat med server
klockan, f&ouml;rutsp&aring; alla framtida kort i realtid.
“ The generation of random numbers is too important to be left to chance. ”
— Robert R. Coveyou
63
Online poker: b&auml;sta praxis
• B&auml;sta praxis f&ouml;r blandning.
- Anv&auml;nd en h&aring;rdvara l&ouml;sning som genererar slumptal som &auml;r godk&auml;nd f&ouml;r
b&aring;de b&aring;de FIPS 140-2 och NIST statistiska prov.
•
Men, h&aring;rdvara slumptal generatorer kan vara &ouml;mt&aring;liga och kan ”fail silently&quot;.
- Anv&auml;nd en opartiska blandningsalgoritm.
64
Sammanfattning
•Enkla algoritmer f&ouml;r att sortera arrayer
- Selection sort
- Insertion sort
- Shell sort
•Blandning
- Att blanda kort &auml;r sv&aring;rt!
•N&auml;st
- N log N sorteringsalgoritmer baserad p&aring; divide-and-conquer
- Mergesort och Quicksort
```