堆排序可以作为实时排序,是原址排序,不需要额外的空间,时间复杂度是O(nlgn),最好最坏平均情况都是这个,但是是不稳定排序,下面是C语言实现的代码。。
//为了简化编程,堆数组元素中的第一个位置不使用。
struct heap {
int size;
int *arr;
} h;
void max_heapify(struct heap * h, int p)
{
int largest;
int hsize = h->size;
int left = p * 2;
int right = p * 2 + 1;
if (left <= hsize && h->arr[left] > h->arr[p]) {
largest = left;
} else {
largest = p;
}
if (right <= hsize && h->arr[right] > h->arr[largest]) {
largest = right;
}
if (largest != p) {
swap(&(h->arr[p]), &(h->arr[largest]));
max_heapify(h, largest);
}
}
void build_max_heap(struct heap * h)
{
int p = h->size / 2;
while(p >= 1) {
max_heapify(h, p--);
}
}
void heap_sort(struct heap *h, int n)
{
int i;
h->size = n;
build_max_heap(h);
for (i = 0; i < n; i++) {
//总是将第一个元素与最后一个元素进行交换,注意数组中第一个位置不使用
swap(&(h->arr[1]), &(h->arr[h->size]));
h->size--;
max_heapify(h, 1);
}
}