首页 > 其他分享 >17.5堆排序实战

17.5堆排序实战

时间:2023-04-14 11:36:49浏览次数:45  
标签:实战 dad int ElemType 堆排序 elem len ST 17.5

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string>
typedef int ElemType;
typedef struct {
    ElemType *elem;  //存储元素的起始地址
    int TableLen;    //元素个数
}SSTable;

void ST_Init(SSTable &ST,int len)
{
    ST.TableLen=len;
    ST.elem=(ElemType *) malloc(sizeof (ElemType)*ST.TableLen);  //申请一块空间,当数组来使用
    int i;
    srand(time(NULL));//随机数生成,每一次执行代码就会得到随机的10个元素
    for (int i = 0; i < ST.TableLen; i++) {
        ST.elem[i]=rand()%100;   //生成的是0-99之间
    }
}
//打印数组中的元素
void ST_print(SSTable ST)
{
    for (int i = 0; i < ST.TableLen; i++) {
        printf("%3d",ST.elem[i]);
    }
    printf("\n");
}


//交换
void swap(ElemType &a,ElemType&b)
{
    ElemType tmp;
    tmp=a;
    a=b;
    b=tmp;
}


//把某个子树调整为大根堆
void AdjustDown1(ElemType A[],int k,int len)
{
    int dad=k;         //父亲的下标
    int son=2*dad+1;   //左孩子的下标
    while (son<len)
    {
        if (son+1<len&&A[son]<A[son+1])    //如果左孩子小于右孩子
        {
            son++;     //拿右孩子
        }
        if (A[son]>A[dad])     //如果孩子大于父亲交换
        {
            swap(A[son],A[dad]);
            dad=son;           //son重新作为dad,去判断下面的子树是否符合大根堆
            son=2*dad+1;       //
        } else{
            break;
        }
    }
}
void HeapSort(ElemType A[],int len)
{
    int i;
    //把堆,调整为大根堆
    for (i=len/2-1;i>=0;i--)
    {
        AdjustDown1(A,i,len);
    }
    swap(A[0],A[len-1]);//交换根部元素和最后一个元素
    for (i = len-1; i>1 ; i--) {   //i代表剩余无序数的数组长度
        AdjustDown1(A,0,i);     //调整剩余元素变为更大堆
        swap(A[0],A[i-1]);  //交换根部元素和无序数的数组的最后一个元素
    }
}


int main() {
    SSTable ST;
    ST_Init(ST,10);   //初始化
//    ElemType A[10]={3,87,2,93,78,56,61,38,12,40};
//    memcpy(ST.elem,A,sizeof (A));
    ST_print(ST);
    HeapSort(ST.elem,10);    //所有元素参与排序
    ST_print(ST);
    return 0;
}

标签:实战,dad,int,ElemType,堆排序,elem,len,ST,17.5
From: https://www.cnblogs.com/su-1007/p/17317778.html

相关文章

  • 17.3选择排序原理及实战
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<string>typedefintElemType;typedefstruct{ElemType*elem;//存储元素的起始地址intTableLen;//元素个数}SSTable;voidST_Init(SSTable&ST,intlen){S......
  • 敏捷测试高效实战-测试架构师成长记的读后感
    序测试工作的最终目标是服务于产品的商业价值;产品质量必须是由测试人员和开发人员共同负责的;测试团队不仅要提升自身的效率,也要提升整个研发团队的交付效率;正如《Google软件测试之道》一书中提到的,测试团队属于工程生产力团队,以产品交付和效率提升为己任;自动化测试平台建立了......
  • vue3微信公众号商城项目实战系列(1)开发环境准备
    项目忙完,这次上新,写一个前端系列,采用vue3来开发一个微信公众号商城。前言:1.微信公众号商城本质也是一个网站,由一个个网页组成,只不过这些网页运行在手机端,能响应手指的点击、长按、拖拽等操作。2.既然是网页,当然可以用3件套(js+html+css)来写,但象vue这样的前端框架比3件套更高效......
  • 16.6快速排序实战
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<string>typedefintElemType;typedefstruct{ElemType*elem;//存储元素的起始地址intTableLen;//元素个数}SSTable;voidST_Init(SSTable&ST,intlen){S......
  • Python网络爬虫学习实战:爬虫快速入门
    很多同学私信问爬虫的相关教程,想了想,还是专门跟大家出些Python爬虫学习相关的教程,从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行。我们编写网络爬虫最主要的目的是爬......
  • 解密!FastDFS的安装及部署(实战篇)
    前言天猫、淘宝等购物网站,海量的商品图片和视频,是如何存储的?当用户访问量大时,又如何保证下载速度?分布式文件系统就是用来解决这些问题的。那么分布式文件系统该如何使用呢?别急,今天袁老师就会带领大家来学习这些非常实用的技能:分布式文件系统概述主流的分布式文件系统的介绍重点介绍......
  • 4.【RabbitMQ实战】- 发布确认
    生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息......
  • 3.【RabbitMQ实战】- 工作队列(Work Queue)
    工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。轮询分发消息......
  • 10.【RabbitMQ实战】- RabbitMQ集群
    搭建集群镜像队列默认情况下node1创建的队列不会同步到node2上此时如果已经发送到了一条消息到node1上的队列,该队列并不会备份到node2上此时node1宕机并重启,该消息会丢失,配置对应策略可保证集群上队列备份并且消息不丢失负载均衡生产者给node1发消息,此时node1宕机,但是......
  • 9.【RabbitMQ实战】- RabbitMQ其他知识点
    幂等性MQ消费者的幂等性的解决一般使用全局ID或者写个唯一标识比如时间戳或者UUID或者订单消费者消费MQ中的消息也可利用MQ的该id来判断,或者可按自己的规则生成一个全局唯一id,每次消费消息时用该id先判断该消息是否已消费过在海量订单生成的业务高峰期,生产端有可能就会重复发......