堆排序

二. 算法描述   

堆是一种完全二叉树结构,并且其满足一种性质:父节点存储值大于(或小于)其孩子节点存储值,分别称为大顶堆、小顶堆。堆一般采用数组进行存储(从下标为1开始),则父节点位置为i,那么其左孩子为2*i,右孩子为2*i + 1。 ki≤K2i且ki≤K2i+1或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ )

二. 算法分析

平均时间复杂度:O(nlog2n)

空间复杂度:O(1) (用于交换数据) 

稳定性:不稳定

三. 算法实现

      //调整节点 大根堆  
//调整节点root,数组共有N个节点  
void adjust_heap(int heap[8],int root,int len)
{
if (len == 1 || root > (len-2)/2)  //root为叶子节点  (len-2)/2 最后一个非叶子节点的位置  
return;
int temp;
int left = 2*root +1;
int right = 2*root +2;
int j;
if (right < len)  //说明i有左右两个子节点         三个节点找最大值 
{
if (heap[root] >= heap[left] && heap[root] >= heap[right])
return;
if (heap[left] >= heap[right])
{
j = left;
}
else
{
j = right;
}
}
else // 说明i只有左节点   二个节点找最大值 
{
if (heap[root] >= heap[left])
return;
else
j = left;
}
temp = heap[j];
heap[j] = heap[root];
heap[root] = temp;
adjust_heap(heap,j,len);
}

//建立堆 
void create_heap(int heap[8],int n)
{
for (int i = n/2; i >=0; i--)
{
adjust_heap(heap,i,n);
}
}


//堆排序 
void heap_sort(int heap[8],int n)
{
create_heap(heap,n);
for (int i = 0;i <n-1; i++)
{
int temp = heap[n-1-i];
heap[n-1-i] = heap[0];
heap[0] = temp;
adjust_heap(heap,0,n-1-i);
}
}

四. 算法分析

       堆的意义在于快速找到最大值最小值,在堆的结构中插入一个新值或者取走最大值/最小值后,重新构造堆,其时间复杂度为O(logn)。堆在实践中用途主要不在于排序,其主要用于算法调度中。比如优先调度中


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值