基本数据结构之最大堆最小堆

一、最大堆和最小堆

    最大堆和最小堆二叉堆的两种形式。

          1)最大堆:根节点的值是所有结点中最大的一个

          2)最小堆:根节点的值是所有结点中做小的一个

二、基本操作

          插入操作:只要将结点插在二叉树最后一个结点位置,然后比较它和父节点的大小,如果大则停止,否则交换位置,然后对父节点递归该过程至根节点。复杂度为O(log(N))

         简单的C语言实现:

        

typedef struct heap {
     int arr[127];
     int size;
}HEAP;

void insert(HEAP *h,int n){
       if(!h)  return;
       int sz = h->size++;
       printf("%d --- %d\n",sz,n);
       while(sz>0){
            if(n < h->arr[(sz-1)/2]){
                h->arr[sz] = h->arr[(sz-1)/2];
                sz = (sz-1)/2;
            }else{
                h->arr[sz] = n;
                return;
            }
       }
       h->arr[0] = n;
}

        删除操作: 要从堆中删除一个结点,用最后一个结点替换掉根结点,然后调整结点顺序以维持堆的特性。

  

void delete(HEAP *h){
       h->size--;
       h->arr[0] = h->arr[h->size];
       h->arr[h->size] = 0;
       int i = 1,cv = h->arr[0],tmp;
       while(h->arr[i]>0){
               if(h->arr[i] < cv){
                      h->arr[(i-1)/2] = h->arr[i];
                      h->arr[i] = cv;
                      i = i*2 + 1;
               }else if(h->arr[i+1] < cv){
                      h->arr[(i-1)/2] = h->arr[i+1];
                      h->arr[i+1] = cv;
                      i = 2*(i+1)+1;
               }else{
                      return;
               }
       }
}


你可能感兴趣的:(C语言,经典数据结构实现)