堆排序

 

#include <stdio.h>
#include <stdlib.h>
int paraent(int i);
int leftchild(int i);
int rightchild(int i);
void max_heap(int data[],int i,int len);
void bulid_max_heap(int data[],int len);
void heap_sort(int data[],int len);

int main()
{
 int nData[10] = {4,10,9,8,7,6,5,4,3,2};    //创建10个数据,测试
 heap_sort(nData, 10);       

 for (int i = 0; i < 10; ++i)       
 {
  printf("%d ", nData[i]);
 }

 printf("/n");
 system("puase");

 return 0;
}

int paraent(int i)
{
 return (i-1)/2;
}

int leftchild(int i)
{
 return 2*i+1;
}

int rightchild(int i)
{
 return 2*(i+1);
}

void max_heap(int data[],int i,int len)//左右子树都已经是最大堆,但父节点并不一定是最大的
{
 int l=leftchild(i);
 int r=rightchild(i);
 int largest;
 if(l<len&&data[l]>data[i])//注意要判断是否有左右子树
  largest=l;
 else
  largest=i;
 if(r<len&&data[r]>data[largest])
  largest=r;
 if(largest!=i)//交换至对大的跟节点
 {
  int temp=data[i];
  data[i]=data[largest];
  data[largest]=temp;
 }
 else
  return;
 max_heap(data,largest,len);//依次往下看
}

void bulid_max_heap(int data[],int len)
{
 int num=(len-1)/2;
 for(int i=num;i>=0;i--)//从叶节点开始构造,叶节点已经是最大堆
  max_heap(data,i,len-1);
}

void heap_sort(int data[],int len)
{
 bulid_max_heap(data,len);  //构建出最大堆
 int num=len;
 for(int i=len-1;i>=1;i--)
 {
  int temp=data[0];//将最大数,根节点与最小的交换
  data[0]=data[i];
  data[i]=temp;
  num=num-1;//则最小的点为最大的数,然后将最小点去掉
  max_heap(data,0,num);//让其在形成最大堆
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值