C++简单交换堆排序
/* Can easily be modified to work with other data types */
void heapsort(int *arr, int n)
{
int start, end;
// heapify the array
for(start = (n - 2) / 2; start >= 0; --start) // for every root
siftDown(arr, start, n); // sift through it
// sort the array
for(end = n - 1; end; --end) // for every element of the heap
{
swapi(&arr[end], &arr[0]); // swap it with the top root
siftDown(arr, 0, end); // rebuild the heap
}
}
void siftDown(int *arr, int start, int end)
{
int root, child;
root = start; // pick the root index
while(2 * root + 1 < end) // while the root has a child
{
child = 2 * root + 1; // pick its index
if((child + 1 < end) && (arr[child] < arr[child+1]))
++child; // if the other child is bigger, pick it instead
if(arr[root] < arr[child]) // if root is smaller than the child
{
swapi(&arr[child], &arr[root]); // swap them
root = child; // go down the heap
}
else // if the child is smaller than the root
return; // that root is in the right spot
}
}
void swapi(int *x, int *y)
{
int z;
z = *x;
*x = *y;
*y = z;
}
