堆排序算法实例(仅供参考)

本文通过C语言实现详细介绍了堆排序算法的工作原理。包括堆排序的头文件定义、核心函数如大顶堆和小堆序的实现,以及主函数中的排序过程。通过实例展示了如何初始化数据、构建堆并进行排序,帮助读者深入理解堆排序。
摘要由CSDN通过智能技术生成

堆排序头文件:

#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;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值