堆排序小结

堆排序:

什么是堆?

最大堆:根结点的键值是所有堆结点键值中最大者的堆。

最小堆:根结点的键值是所有堆结点键值中最小者的堆。

(1) 基本思想  需要会手动进行堆排序操作

1.  构建堆;

2.  取堆得顶部元素,调整堆;

(2)代码

void heap_sort(int data[],int count)

{

     int current;

     int last_unsorted;

     build_heap(data,count);

     for(last_unsorted = count - 1; last_unsorted > 0;last_unsorted--)

     {

         current = data[last_unsorted];       //意义:删除堆中最后一个节点

         data[last_unsorted] = data[0];       //移出堆顶到顺序表(从后到前存放)  

         insert_heap(data,current,0,last_unsorted - 1); //将之前堆中最后一个节点插入,维护堆性质

     }

}

void build_heap(int data[],int n)

{

     int root;  //堆树的根位置         

     for(root = n/2 - 1;root>=0;root--)   

     {

         int current = data[root];

         insert_heap(data,current,root,n-1);

     }

    

}

void insert_heap(int data[],int current,int root,int high)  

{

     int large;       //large表示current应该插入的位置

     large = 2*root + 1;  

     while(large <= high)  

     {

         if(large < high && data[large] < data[large + 1]) //先选择左右孩子较大一个。

              large++;

 

         if(current >= data[large])   //如:current大,则插入的节点应该加到root位置.

              break;

         else   //否则把两个孩子中较大者上移,再循环比较

         {

              data[root] = data[large];

              root = large;

              large = 2*root + 1;

         }

     }

     data[root] = current;

}

 (3)堆排序性能:

最好时间O(nlogn)  平均时间O(nlogn)  最坏时间O(nlogn)   稳定性--不稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_千鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值