堆排序头文件:
#ifndef _SEAP_H_
#define _SEAP_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
typedef int data_t;
void seapsort(data_t *data,int sizeof_t);//初始赋值
void swap(data_t *a,data_t *b);
void seapprintf(data_t *data,int sizeof_t);//打印
int seapmax(data_t *data,int sizeof_t);//获取最大值下标
void seapbig(data_t *data,int sizeof_t,int max);//大顶堆
void seapsmall(data_t *data,int sizeof_t);//小堆序
#endif
堆排序c文件:
#include "seap.h"
void seapsort(data_t *data,int sizeof_t)//初始赋值
{
srand(time(NULL));
int i=0;
for(;i<sizeof_t;i++)
data[i]=rand()%1000;
}
void seapprintf(data_t *data,int sizeof_t)//打印
{
int i=0,j=0;
for(;i<sizeof_t;i++)
{
printf("%5d",data[i]);
j++;
if(j%8==0)
printf("\n");
}
printf("\n");
}
void swap(data_t *a,data_t *b)//交换数据
{
long neam=*a;
*a=*b;*b=neam;
}
int seapmax(data_t *data,int sizeof_t)//获取最大值下标
{
int i=0,max=0;
for(i=1;i<sizeof_t;i++)
if(data[max]<data[i])
max=i;
return max;
}
void seapbig(data_t *data,int sizeof_t,int max)//大顶堆
{
int temp=max;
if(max*2+2<sizeof_t)
{
if(data[max*2+1]<data[max*2+2]&&data[max]<data[max*2+2])
temp=max*2+2;
if(data[max*2+1]>data[max*2+2]&&data[max]<data[max*2+1])
temp=max*2+1;
}
else if(max*2+1<sizeof_t)
if(data[max*2+1]>data[max])
temp=max*2+1;
if(temp!=max)
{
swap(&data[max],&data[temp]);
seapbig(data,sizeof_t,temp);
}
}
void seapsmall(data_t *data,int sizeof_t)//小堆序
{
int i=0;
for(i=sizeof_t-1;i>0;i--)
{
swap(&data[0],&data[i]);
seapbig(data,i,0);
}
}
堆排序mian函数:
#include <stdio.h>
#include "seap.h"
#define SIZE 20
int main(int argc, char *argv[])
{
data_t data[SIZE]={0};
seapsort(data,SIZE);//初始赋值
printf("初始值:\n");
seapprintf(data,SIZE);//打印
printf("------------\n");
do{
max=(max-1)/2;
seapbig(data,SIZE,max);//大顶堆
}while(max>2);
seapbig(data,SIZE,max);//大顶堆
seapsmall(data,SIZE);//小堆序
printf("------------\n");
printf("堆排序后:\n");
seapprintf(data,SIZE);//打印
return 0;
}