|
@ -31,7 +31,7 @@ |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
#if defined(LIBC_SCCS) && !defined(lint) |
|
|
#if defined(LIBC_SCCS) && !defined(lint) |
|
|
static char *rcsid = "$OpenBSD: heapsort.c,v 1.4 2003/06/02 20:18:37 millert Exp $"; |
|
|
|
|
|
|
|
|
static char *rcsid = "$OpenBSD: heapsort.c,v 1.5 2003/09/07 18:57:05 jmc Exp $"; |
|
|
#endif /* LIBC_SCCS and not lint */ |
|
|
#endif /* LIBC_SCCS and not lint */ |
|
|
|
|
|
|
|
|
#include <sys/types.h> |
|
|
#include <sys/types.h> |
|
@ -68,7 +68,7 @@ static char *rcsid = "$OpenBSD: heapsort.c,v 1.4 2003/06/02 20:18:37 millert Exp |
|
|
* Build the list into a heap, where a heap is defined such that for |
|
|
* Build the list into a heap, where a heap is defined such that for |
|
|
* the records K1 ... KN, Kj/2 >= Kj for 1 <= j/2 <= j <= N. |
|
|
* the records K1 ... KN, Kj/2 >= Kj for 1 <= j/2 <= j <= N. |
|
|
* |
|
|
* |
|
|
* There two cases. If j == nmemb, select largest of Ki and Kj. If |
|
|
|
|
|
|
|
|
* There are two cases. If j == nmemb, select largest of Ki and Kj. If |
|
|
* j < nmemb, select largest of Ki, Kj and Kj+1. |
|
|
* j < nmemb, select largest of Ki, Kj and Kj+1. |
|
|
*/ |
|
|
*/ |
|
|
#define CREATE(initval, nmemb, par_i, child_i, par, child, size, count, tmp) { \ |
|
|
#define CREATE(initval, nmemb, par_i, child_i, par, child, size, count, tmp) { \ |
|
@ -90,12 +90,12 @@ static char *rcsid = "$OpenBSD: heapsort.c,v 1.4 2003/06/02 20:18:37 millert Exp |
|
|
* Select the top of the heap and 'heapify'. Since by far the most expensive |
|
|
* Select the top of the heap and 'heapify'. Since by far the most expensive |
|
|
* action is the call to the compar function, a considerable optimization |
|
|
* action is the call to the compar function, a considerable optimization |
|
|
* in the average case can be achieved due to the fact that k, the displaced |
|
|
* in the average case can be achieved due to the fact that k, the displaced |
|
|
* elememt, is ususally quite small, so it would be preferable to first |
|
|
|
|
|
|
|
|
* elememt, is usually quite small, so it would be preferable to first |
|
|
* heapify, always maintaining the invariant that the larger child is copied |
|
|
* heapify, always maintaining the invariant that the larger child is copied |
|
|
* over its parent's record. |
|
|
* over its parent's record. |
|
|
* |
|
|
* |
|
|
* Then, starting from the *bottom* of the heap, finding k's correct place, |
|
|
* Then, starting from the *bottom* of the heap, finding k's correct place, |
|
|
* again maintianing the invariant. As a result of the invariant no element |
|
|
|
|
|
|
|
|
* again maintaining the invariant. As a result of the invariant no element |
|
|
* is 'lost' when k is assigned its correct place in the heap. |
|
|
* is 'lost' when k is assigned its correct place in the heap. |
|
|
* |
|
|
* |
|
|
* The time savings from this optimization are on the order of 15-20% for the |
|
|
* The time savings from this optimization are on the order of 15-20% for the |
|
|