zoukankan      html  css  js  c++  java
  • 小顶堆---非递归C语言来一发

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #define HEAP_SIZE 100
      5 #define HEAP_FULL_VALUE -100
      6 
      7 #if 0
      8 /*小顶堆存储结构*/
      9 typedef struct small_heap
     10 {
     11     int data[HEAP_SIZE];
     12     int num;
     13 }SMALL_HEAP;
     14 #endif
     15 
     16 
     17 /*
     18  * name: heap_Swap
     19  *
     20  * purpose:
     21  *     swap two value of heap
     22  */
     23 static void heap_Swap(int heap[],int index_src,int index_dst)
     24 {
     25     int tmp = heap[index_src];
     26 
     27     heap[index_src] = heap[index_dst];
     28     heap[index_dst] = tmp;
     29 }
     30 
     31 /*
     32  * name: heap_Up
     33  *
     34  * purpose:
     35  *     move up value of the index position to adjust heap struct
     36  */
     37 static void heap_Up(int heap[],int index)
     38 {
     39     int parent = index / 2;
     40     
     41     while(parent >= 1)
     42     {
     43         if(heap[index] < heap[parent])
     44         {
     45             heap_Swap(heap,index,parent);
     46             index = parent;
     47         }
     48         else
     49         {
     50             break;
     51         }
     52     }
     53 }
     54 
     55 /*
     56  * name: heap_Down
     57  *
     58  * purpose:
     59  *     move down value of the index position to adjust heap struct
     60  */
     61 static void heap_Down(int heap[],int index,int heap_data_num)
     62 {
     63     if(index * 2 > heap_data_num)
     64     {//leaf node can not move down
     65         return;
     66     }
     67 
     68     while(index * 2 <= heap_data_num)
     69     {
     70         int child = index * 2; // left child 
     71 
     72         if(child > heap_data_num)
     73         { 
     74             return;
     75         }
     76 
     77         if(child * 2 < heap_data_num)
     78         {//the node have two child
     79          //use multiply 2 to judge not use divide 2 to judge to pretend error 
     80             if(heap[child + 1] < heap[child])
     81             {
     82                 child += 1; //right child is smaller update
     83             }
     84 
     85         }
     86         
     87         if(heap[child] < heap[index])
     88         {//the child samller than index swap value
     89             heap_Swap(heap,index,child);
     90             index = child;
     91         }
     92         else
     93         { 
     94             break;
     95         }
     96     }
     97 }
     98 
     99 /*
    100  * name: heap_Insert
    101  *
    102  * purpose:
    103  *     insert a value into heap and ajust heap struct
    104  */
    105 void heap_Insert(int heap[],int *heap_data_num,int value)
    106 {
    107     if(*heap_data_num == 0)
    108     {
    109         heap[0] = HEAP_FULL_VALUE; //data 0 do not save in the heap 
    110     }
    111 
    112     (*heap_data_num)++;    //update heap size
    113     heap[*heap_data_num] = value; //add value to heap
    114 
    115     heap_Up(heap,*heap_data_num); //adjust heap struct
    116 }
    117 
    118 /*
    119  * name: heap_Delete
    120  *
    121  * purpost:
    122  *     delete a value from heap
    123  */
    124 void heap_Delete(int heap[],int *heap_data_num,int value)
    125 {
    126     int index;
    127     
    128     for(index = 1; index <= *heap_data_num; index++)
    129     {
    130         if(heap[index] == value)
    131         {
    132             break;
    133         }
    134     }
    135 
    136     if(index > *heap_data_num)
    137     {//the value is not exist
    138         return;
    139     }
    140 
    141     heap[index] = heap[*heap_data_num]; //set the index value as final value
    142     
    143     (*heap_data_num)--;//the final value is not as the heap
    144 
    145     heap_Down(heap,index,*heap_data_num); //move down 
    146     
    147     int parent = index / 2; 
    148     if(parent > 0 && heap[index] < heap[parent])
    149     {//ajust to the special situation
    150         heap_Up(heap,index);
    151     }    
    152     
    153     heap[*heap_data_num + 1] = HEAP_FULL_VALUE; //delete final data
    154 }
    155 
    156 void heap_Print(int heap[],int heap_data_num)
    157 {
    158     int i;
    159     for(i = 1; i <= heap_data_num; i++)
    160     {
    161         printf("%d ",heap[i]);
    162     }
    163 
    164     printf("
    ");
    165 }
    166 
    167 
    168 int main()
    169 {
    170     int heap[HEAP_SIZE];        
    171     int i,heap_data_num = 0;
    172 
    173     for(i = 0; i < heap_data_num; i++)
    174     {
    175         heap[i] = HEAP_FULL_VALUE;
    176     }
    177     
    178 #if 0
    179     heap_Insert(heap,&heap_data_num,1);
    180     heap_Insert(heap,&heap_data_num,3);
    181     heap_Insert(heap,&heap_data_num,4);
    182     heap_Insert(heap,&heap_data_num,5);
    183     heap_Insert(heap,&heap_data_num,8);
    184     heap_Insert(heap,&heap_data_num,2);
    185     heap_Insert(heap,&heap_data_num,7);
    186     heap_Insert(heap,&heap_data_num,6);
    187 
    188     heap_Print(heap,heap_data_num);
    189     
    190     heap_Delete(heap,&heap_data_num,2);
    191     heap_Print(heap,heap_data_num);
    192     heap_Delete(heap,&heap_data_num,1);
    193     heap_Print(heap,heap_data_num);
    194     
    195 #endif
    196 
    197 #if 1
    198     heap_Insert(heap,&heap_data_num,1);
    199     heap_Insert(heap,&heap_data_num,3);
    200     heap_Insert(heap,&heap_data_num,11);
    201     heap_Insert(heap,&heap_data_num,5);
    202     heap_Insert(heap,&heap_data_num,4);
    203     heap_Insert(heap,&heap_data_num,8);
    204     heap_Insert(heap,&heap_data_num,7);
    205     heap_Insert(heap,&heap_data_num,6);
    206 
    207     heap_Print(heap,heap_data_num);
    208     
    209     heap_Delete(heap,&heap_data_num,8);
    210 
    211     heap_Print(heap,heap_data_num);
    212 #endif
    213 
    214 }


    注:需要注意一点就是在进行节点是否有两个孩子的判断时,要用*2去判断,不能用除2判断,因为除2自动取整会导致少1的错误。
  • 相关阅读:
    java的语法基础(二)
    MyBatis 的好处是什么?
    python中字符串的编码和解码
    Spring的简介和优点?
    相对于Statement,PreparedStatement的优点是什么?
    MyBatis 的好处是什么?
    .final finally finalize区别
    final类有什么用
    web广泛用到的技术:
    JDK,JRE,JVM三者的关系
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/4972744.html
Copyright © 2011-2022 走看看