个人学习——《算法导论》 第6章 堆排序 个人笔记

这篇博客介绍了如何使用C语言和Python实现从无序数组构建二分树并进行排序的过程。首先,通过生成随机数组开始,然后转换为满足二分树条件的结构。接下来,通过不断地调整节点位置,确保树的每个节点都大于其子节点。最后,通过交换最高节点与最后一个节点并重新调整,完成排序。示例代码详细展示了这一过程。

先将无序的一个数组转换成一颗二分树的形状
二分树满足:
每个节点的数字都会大于两个节点的数字
节点对应的数字与子节点的数字有以下对应关系
i,2i,2i+1.
因此我们进行该类排序的时候有以下几步:
①生成一个随机数组
②转换成满足要求的二分树图片来自网络,侵删

③将最高处的数字和最后一个数字进行交换,再次转换成满足要求的二分树
图片来自网络,侵删

C语言实现

①生成序列

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int * build_heap()
{
    srand((unsigned)time(NULL));
    int *p = (int *)malloc(sizeof(int) * 100);
    for(int i = 0; i < 100; i++)
    {
        p[i] = rand() % 100 ;
    }
    
    return p;
}

②转换成二分树

void swap(int *p1, int*p2)
{
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

void keep(int arr[], int len)
{
    int first = len / 2;
    for(int i = first; i >= 0; i--)//从底到上
    {
        if(i * 2 + 1 > len)
        {
            if(arr[i] < arr[i * 2])
            swap(&arr[i],&arr[2 * i]);
        }
        else
        {
            if(arr[i] <arr[2 * i] || arr[i] < arr[2 * i +1])
            {
                if(arr[2 * i] < arr[2 * i + 1])
                {
                    swap(&arr[i] , &arr[2 * i + 1]);
                }
                else
                {
                    swap(&arr[i] , &arr[2 * i]);
                }
                
            }
        }
    }
}

③排序

void sort(int arr[], int len)
{   
    
    for(int i = len; i > 0; i--) // 最后一个还用换?不必了
    {
        swap(&arr[0] , &arr[i]);
        keep(arr, i-1);
    }
}

int main()
{   
    int *p1 = build_heap();
    //int len = sizeof(array)/sizeof(array[0]);
    //sort(array,len);

    sort(p1,100);
    for(int i = 0; i < 100; i++)
    {printf("%d,",p1[i]);}
    return 0;
}

Python实现


L = [69,56,94,37,66,75,73,12,16,68,10,78,44,48,93,9,
70,32,90,52,97,11,69,74,67,24,75,59,61,92,80,74,42,91,66,20,
44,82,28,92,76,1,60,67,76,30,2,34,50,26,43,30,30,38,57,23,14,
17,15,44,14,92,95,66,67,14,50,70,4,41,15,8,86,44,76,90,95,90,
57,58,98,27,91,79,69,74,24,61,29,95,36,74,29,70,31,87,76,87,
72,56]

def swap(L,a,b):
    c = L[a]
    L[a] = L[b]
    L[b] = c
    
    return L
    
def keep(L,leng):
    first = leng // 2
    for i in range(first,-1,-1):
        if(2 * i + 1 > leng):
            if(L[i] < L[2 * i]):
                L = swap(L,i, 2 * i)
        else:
            if(L[i] < L[2 * i] or L[i] < L[2 * i + 1]):
                if(L[2 * i] < L[2 * i + 1]):
                    L = swap(L,i, 2 * i + 1)
                else:
                    L = swap(L,i, 2 * i)
    return L

def sort(L,leng):
    
    L = swap(L,0, leng)
    for i in range(leng,0,-1):
        L = keep(L,i)
        L = swap(L,0, i)
    print(L)

sort(L,len(L)-1)

内容概要:本文档系统性地介绍了2024年最新提出的两种智能优化算法——青蒿素优化算法与霜冰优化算法(RIME)的原理、实现方法及其性能对比分析,并提供了完整的Matlab代码实现。文档不仅聚焦于核心算法的仿真与验证,还整合了大量前沿科研资源,涵盖微电网优化、风电功率预测、无人机三维路径规划、电动汽车调度、图像融合、负荷预测、通信信号处理、电力系统故障恢复等多个高价值应用场景。所有案例均基于Matlab/Simulink平台进行建模与仿真,强调算法在复杂工程系统中的实际应用能力,旨在为科研人员提供一套从理论到代码再到应用的完整复现体系。; 适合人群:具备一定编程基础和科研背景的研究生、高校教师及工程技术人员,尤其适合从事智能优化算法研究、新能源系统优化、自动化控制、电力系统调度、无人机导航与路径规划等相关领域的研究人员。; 使用场景及目标:①用于高水平学术论文的复现与创新性研究,提升科研效率与成果产出;②应用于复杂工程系统的建模仿真与智能优化设计,如多能互补系统调度、无人机避障路径规划、微电网能量管理等;③作为智能优化算法的教学与学习资料,深入理解现代元启发式算法的设计思想与实现机制。; 阅读建议:建议读者结合文档中提供的Matlab代码与Simulink仿真模型,按照目录结构循序渐进地学习与实践,优先选择与自身研究方向契合的案例进行代码复现,重点关注算法参数设置、收敛曲线分析与多算法对比实验部分,以全面提升算法应用与科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值