堆排序---最大堆的创建和最大推的排序

typedef struct{
	int data[100+1];
    int length;
}Slist;
void swap(Slist *L,int i,int j){
	int tmp=L->data[i];
	L->data[i]=L->data[j];
	L->data[j]=tmp;
}

void HeapAdjust(Slist *L,int s,int m){
	//理解该代码要完全二叉树联系起来,不清楚画图分析
	//并理解堆排序的定义-----最大堆:每个节点值都大于或等于左右孩子节点值。
	int temp=L->data[s];
	for(int j=2*s;j<=m;j*=2){
	  
		if(j<m && L->data[j]<L->data[j+1])//找出左右子树中值大的。并记住下标
			j++;
		if(temp>L->data[j]) //对当前要调整节点值和左右子树中较大的值比较。若比左右子树值都大则不交换数据。
			break;
		L->data[s]=L->data[j];
		s=j;	
	}
	L->data[s]=temp;
}
//创建最大堆--创建顺序:从下往上,从右往左。
void craateHeap(Slist *L){
	for(int i=L->length/2;i>0;i--)//完全二叉树非叶子节点个数=叶子节点个数或者叶子节点个数-1;
	HeapAdjust(L,i,L->length);
}
//已知最大堆,进行排序
void Maxheapsort(Slist *L){ 
	   for(int i=L->length;i>1;i--){// n-1次循环
		   swap(L,1,i);
	   HeapAdjust(L,1,i-1);
	   }
	 }
void main(){
	int a[]={0,110,10,35,30,71,42,80,23,43,54,67};

	int len=sizeof(a)/sizeof(int)-1;
	//1、初始化未排序的线性表

	Slist SS,*L;
	 L=&SS;
	 L->length=len;
	 int i=len;
	 while (i)
	 {
		 L->data[i]=a[i];
		 i--;
	 }
	printf("数据未排序前:\n ");
	for(int k=1;k<=L->length;k++)
	   printf("%d  ",L->data[k]);
	 //2、对已知未排序的线性表进行最大堆的创建
	 craateHeap(L);
	 //3、对最大堆进行排序(完全二叉树层次排序)
	  Maxheapsort(L);
	//4、打印查看
    printf("\n  数据排序后:\n ");
        for(int k=1;k<=L->length;k++)
		     printf("%d  ",L->data[k]);
	while (true)
	{

	}

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值