堆排序算法的实现

问题描述

 对于任一无序正整数序列,写一程序用堆排序算法将其排序成按值非递减有序序列
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define init_size 2000
#define OK 1
#define ERROR 0
struct HeapType {
	ElemType *elem;
	int length=0;
	int list_size;
}
int initList(HeapType &L){//初始化数组
	L.elem=(int*)malloc(init_size*sizeof(int));
	if(!L.elem) exit(1);//存储分配失败 
	L.length=0;
	L.list_size=init_size;
	return OK;
}//构建线性表 
void HeapAdjust(HeapType & L,int s,int m){//筛选法调整堆
//假设r[s+1..m]已经是堆了,将r[s..m]调整为以r[s]为根的大根堆
	int r=L.elem[s];
	for(int i=2*s;i<=m;i*=2){//传入的时候可能s=m/2,所以只执行一次
		if(i<m&&L.elem[i]<L.elem[i+1]) i++;//找最大的子节点; 
		if(r>L.elem[i]) break;//如果此时父节点大于子节点,r应该插在s的位置上,所以不做任何调整
		L.elem[s]=L.elem[i],s=i;//i号元素比s要大,所以把i号元素和s做一个交换,继续进行寻找,原来的s存储在r里面所以不需要担心 
	}
	L.elem[s]=r;
}
void CreatHeap(HeapType &L){//建初堆
	int n=L.length;
	for(i=n/2;i>0;--n){
		HeapAdjust(L,i,n);
	}
}
void HeapSort(HeapType & L){
	CreatHeap(L);//此时最大数值在根节点上
	for(int i=L.length;i>1;i--){//将根结点的数放到最后
		int temp=L.elem[i];
		L.elem[i]=L.elem[1];
		L.elem[1]=temp; 
		HeapAdjust(L,1,i-1);
	}
}
int main(){
	int num;
	FILE *fp1=NULL,*fp2=NULL;
	fp1=fopen("input.txt","r");
	fp2=fopen("output.txt","w");
	while(fscanf(fp,"%d",&num),num!=-1){
		HeapType list;
		initList(List);
		for(int i=1;i<=num;i++){
			fscanf(fp1,"%d",&List.elem[i]);
			List.length++;
		}
		HeapSort(List); 
		for(int i=1;i<=List.length;i++){
			fprintf(fp2,"%d",List.elem[i]);
		}
		fprintf("\n");
	}
}




一.malloc

 原型:extern void *malloc(unsigned int num_bytes);     

 使用格式(类型)malloc(长度)     (char*)malloc(x*sizeof(char))    (int*)malloc(y*sizeof(int))  x,y代表实际分配的个数

 头文件:#include <malloc.h>

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
————————————————
版权声明:本文为CSDN博主「lk小强」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40807247/article/details/80292206

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

caesarding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值