最大堆和堆排序
最大堆
#define maxdata 10000000
struct heapstruct { elementtype *elements; //儲存堆元素的陣列 int size; //堆的當前元素個數 int capacity; //堆的最大容量 };
最大堆的建立
struct heapstcuct *create(int maxsize) { //建立容量為maxsize的空的最大堆 struct heapstruct *h; h =(struct heapstruct *)malloc(sizeof(struct heapstruct)); h->elements =(elementtype *)malloc((maxsize+1)*sizeof(elementtype)) h->size = 0; h->capacity = maxsize; h->elements[0] = maxdata; //定義"哨兵"位大於堆中所有可能元素的值,便於以後更快操作 return h; }
最大堆的元素插入
void insert(struct heapstruct *h, elementtype item) { //元素item插入最大堆h,其中h->element[0]已經定義為哨兵 int i; if(isfull(h)) { printf("最大堆已滿!"); return ; } i = ++h->size; //i指向插入後堆中最後一個元素的位置 for(; h->elements[i/2] < item; i /= 2 ) { h->elements[i] = h->elements[i/2]; //向下過濾節點 } h->elements[i] = item; }
最大堆的元素刪除
elementtype deletemax(struct heapstruct *h) { //從最大堆h中取出鍵值為最大的元素,並刪除一個節點 int parent, children; elementtype maxitem, tmp; if(isempty(h)) { printf("最大堆已空!"); return ; } maxitem = h->elements[1]; //取出根節點最大值 //用最大堆中最後一個元素從根節點開始向上過濾下層結點 tmp = h->elements[h->size--]; for(parent = 1; parent * 2 <= h->size; parent = child) { child = parent * 2; if((child != h->size) && (h->elements[child] < h->elements[child + 1])) { child++; //child指向左右子節點的較大者 } if(tmp >= h->elements[child]) { break; } else //移動tmp元素到下一層 { h->elements[parent] = h->elements[child]; } } h->elements[parent] = tmp; return maxitem; }
堆排序
void heap(elementtype a[], int n) { buildheap(a); // 建一個最小堆 O(N) for(i = 0; i < n; i++) { tmp[i] = deleteheap(a); // O(log(N)) } for(i = 0; i < n; i++) { a[i] = tmp[i]; // O(N) } }