码迷,mamicode.com
首页 > 其他好文 > 详细

堆实现

时间:2015-07-08 16:45:48      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

一、堆排序 (Heap  sort)

     定义: 完全二叉树的非终端节点的值均不大于(不小于)子节点的值

     存储结构:  数组 |  vector

     逻辑结构:  完全二叉树

     性质:

              a.  节点编号 0...n-1

              b.  节点i, 左字节点= 2*i+1, 右子节点 = 2*i + 2;

              c.  最后一个非终端节点:n/2 - 1 (n为节点的个数)

     要分析的问题:

      1)如何由无序数组建立一个堆  

for i = n/2 -1, n>=0; i--
    heap_adjust(heap,i,n);   //向下调整当前i为根的树,从最后一个非终端节点开始

      2)输出堆顶元素后如何继续调整剩余的堆        

heap[0]= heap[n-1];
adjust(heap,0,n-1);  //从顶点向下开始调整

         关键:  heap_adjust (swift_down)向下调整函数

c语言实现

#include <stdio.h>
//从 1开始计数的最小堆
void heap_adjust(int heap[], int i,int len)
{
#if 0
     //递归实现
    int l = 2 * i + 1;
    int r = l + 1;
    int min = i;
    if(l < len && heap[l] < heap[i])  min = l;
    if(r < len && heap[r] < heap[min])  min = r;
    if(min != i)
    {
        int tmp = heap[min];
        heap[min] = heap[i];
        heap[i] = tmp;
        heap_adjust(heap,min,len);
    }
#else
    //非递归实现
    int tmp = heap[i];  //暂时存储
    int min;            //记录交换的节点
    for(int k=i; k<len;)
    {
        int l = k * 2 + 1;
        int r = l + 1;
        min = k;
        if(l < len && heap[l] < heap[k]) min = l;
        if(r < len && heap[r] < heap[min]) min = k;
        
        if(min == k)  break; 
        heap[k] = heap[min];
        k = min;    
    }    
    heap[min] = tmp;
#endif
}
void build_heap(int heap[], int len)
{
     for(int k = len/2-1; k >= 0; k--)
     {
         heap_adjust(heap,k,len);
     }    
}
void heap_sort(int heap[] ,int len)
{
     build_heap(heap, len);
     
     for(int i=len-1; i>0; i--){
         printf("%d->%d.\n",len-i,heap[0]);
         heap[0] = heap[i];
         heap_adjust(heap,0,i);
     }
}
int main()
{
     int arr[] = {96,85,53,47,56,38,36,12,24};
     heap_sort(arr,9);
     //build_heap(arr,9);
     return 0;
}


堆实现

标签:

原文地址:http://my.oschina.net/u/573270/blog/476206

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!