Soultaker schreef op 29 August 2003 @ 17:11:
Ben benieuwd wat jij onder "uitgaan van" verstaat. Volgens mij is een random keuze van je pivot point net zo slecht als het domweg kiezen van het eerste element, als het gaat om de worst case performance van random data sets. Het enige verschil is dat het worst case gedrag dan bij andere data sets optreedt (en dus niet bij de relatief vaak voorkomende gesorteerde invoer).
Wat natuurlijk belangrijk is, is dat met QuickSort de gemiddelde complexiteit wel O(N*log(N)) is.
Ik bedoelde met 'uitgaan van' de expected running time van qsort. Je hebt inderdaad gelijk dat die worst case nog steeds O(n^2) is. Echter die worst case scenario variëert dan wel steeds, de ene keer is het 1,2,3 de volgende keer is het 3,2,1 bijv. wat het natuurlijk totaal ongeschikt maakt voor de voorspelbaarheid van de executie tijd. Dus je hebt helemaal gelijk, ik heb het fout geformuleerd
Nog een leuk stukje quote uit een boek van M Goodrich en R Tamassia
quote: Data structures and Algorithms in Java SE
Experimental studies have shown that if an input sequence can fit entirely in main memory, then the in-place versions of quick-sort and heap-sort run faster then merge-sort. In fact, quick-sort tends, on average, to beat heap-sort in these tests. So, quick-sort is an excellent choice as an general-purpose sorting utility.
spelfouten zijn © * Glimi 
In ieder geval is HeapSort goed iteratief te programmeren. De echte truc van HeapSort is natuurlijk om in-place te sorteren en niet een losse heap (met een echte recursieve datastructuur) op te bouwen; anders wordt de verborgen constante (ondanks de goede worst case complexiteit) wel erg hoog.
Ik weet eigenlijk niet hoe groot dat verschil is. Misschien leuk dat eens te testen.
Mergesort is, denk ik, ook wel iteratief te implementeren.
Zou dat veel winst opleveren? Je spaart natuurlijk de recursieve aanroep uit, maar zijn die kosten nou zo hoog tov de input?
De java library (java.util.Arrays) doet het in ieder geval gewoon recursief (mergesort).
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| private static void mergeSort(Object src[], Object dest[],
int low, int high) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < 7) {
for (int i=low; i<high; i++)
for (int j=i; j>low &&
((Comparable)dest[j-1]).compareTo((Comparable)dest[j])>0; j--)
swap(dest, j, j-1);
return;
}
// Recursively sort halves of dest into src
int mid = (low + high) >> 1;
mergeSort(dest, src, low, mid);
mergeSort(dest, src, mid, high);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (((Comparable)src[mid-1]).compareTo((Comparable)src[mid]) <= 0) {
System.arraycopy(src, low, dest, low, length);
return;
}
// Merge sorted halves (now in src) into dest
for(int i = low, p = low, q = mid; i < high; i++) {
if (q>=high || p<mid && ((Comparable)src[p]).compareTo(src[q])<=0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
} |
Misschien leuk om op te merken dat java voor primitieven quick-sort gebruikt en voor objecten merge-sort. Heb jij enig idee waarom?
[
Voor 3% gewijzigd door
Glimi op 30-08-2003 11:37
]