1. 程式人生 > >最大堆和堆排序

最大堆和堆排序

最大堆

#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)     } }