堆排序可以作为实时排序,是原址排序,不需要额外的空间,时间复杂度是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); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-09-30 15:26:41