问题描述
对于任一无序正整数序列,写一程序用堆排序算法将其排序成按值非递减有序序列
#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