小根堆的实现_by watson.long

小根堆实现与排序
本文介绍了一种小根堆的数据结构实现,并通过具体的代码示例展示了如何利用该数据结构进行堆排序。主要内容包括:小根堆的基本操作如创建、下沉、上浮、插入和删除元素等,以及如何使用这些操作完成对整型数组的排序。

小根堆的实现

——————————————————

#include "stdio.h"
#include
"stdlib.h"
#include
"string.h"
/*minheap struct*/
typedef
struct hnode{
int heap[100];
int currentsize;
}minheapnode,
*minheap;

/*minheap*/
void creatheap(minheap *h,int a[], int n);
void siftdown(minheap *h,int i,int m);
void siftup(minheap *h,int start);
void insert(minheap *h,int x);
int remove(minheap *h);
void heapsort(minheap *h,int a[], int n);

void main(int argc,char *argv[])
{
int data[10]={9,1,2,4,6,10,23,5,3,56};
/*sort*/
minheap h;
h
=(minheap)malloc(sizeof(minheapnode));
h
->currentsize=0;
heapsort(
&h,data,10);
}

/*heap sort*/
void heapsort(minheap *h,int a[], int n)
{
int i;
int temp;
/*creat heap*/
creatheap(h,a,n);
/*sort heap*/
for(i=(*h)->currentsize-1;i>0;i--)
{
temp
=(*h)->heap[0];
(
*h)->heap[0]=(*h)->heap[i];
(
*h)->heap[i]=temp;
siftdown(h,
0,i-1);
}
/*print sort heap*/
for(i=(*h)->currentsize-1;i>=0;i--)
{
printf(
"%d ",(*h)->heap[i]);
}
return;
}
/*creat minheap*/
void creatheap(minheap *h,int a[], int n)
{
int currentpos;
int i;
for(i=0;i<n;i++)
{
(
*h)->heap[i]=a[i];
}
(
*h)->currentsize=n;
currentpos
=((*h)->currentsize-2)/2;
while(currentpos >=0)
{
siftdown(h,currentpos,(
*h)->currentsize-1);
currentpos
--;
}
}
/*siftdown function*/
void siftdown(minheap *h,int i,int m)
{
int j;
int temp=(*h)->heap[i];
for(j=2*i+1;j<=m;j=2*j+1)
{
if( (j<m) && ( (*h)->heap[j] > (*h)->heap[j+1] ) ) j++;
if(temp <= (*h)->heap[j]) break;
else
{
(
*h)->heap[i]=(*h)->heap[j];
i
=j;
}
}
(
*h)->heap[i]=temp;
}
/*siftup function*/
void siftup(minheap *h,int start)
{
int temp,i,j;
temp
=(*h)->heap[start];
j
=start;
i
=(j-1)/2;

while(j>0)
{
if((*h)->heap <= temp) break;
else
{
(
*h)->heap[j] = (*h)->heap[i];
j
=i;
i
=(i-1)/2;
}
}

(
*h)->heap[j]=temp;
}
/*insert handle*/
void insert(minheap *h,int x)
{
if((*h)->currentsize == 100) return;
(
*h)->heap[(*h)->currentsize]=x;
siftup(h,(
*h)->currentsize);
(
*h)->currentsize++;
return;
}
/*remove handle*/
int remove(minheap *h)
{
int x=0;
if((*h)->currentsize==0) return;
x
=(*h)->heap[0];
(
*h)->heap[0]=(*h)->heap[(*h)->currentsize-1];
(
*h)->currentsize--;
siftdown(h,
0,(*h)->currentsize-1);
return x;
}

转载于:https://www.cnblogs.com/watsonlong/archive/2011/03/25/1995023.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
SELECT S.STUDYNAME AS study, GS.ANALYTEDESCRIPTION AS analyte, SS.RUNID AS run_id, SS.CONCENTRATION AS concentration, DS.USERSAMPLEID AS custom_id, DS.TIMETEXT AS time_text, DS.TREATMENTEVENTID AS split, DT.DESIGNSUBJECTTAG AS subject, DST.TREATMENTID AS subject_group, AAT.NM AS lloq, AAT.VEC AS uloq, CS.CONCENTRATIONUNITS AS concentration_units, CN.TUBECONDITIONTEXT AS tube_Condition, RG.REASSAYREASON AS reassay_tag_reason, RG.TAGSTATUS AS reassay_tag_status, CASE WHEN SS.ALIQUOTFACTOR IS NULL OR SS.ALIQUOTFACTOR = 0 THEN NULL ELSE 1 / SS.ALIQUOTFACTOR END AS dilution_factor FROM WATSON.SAMPLERESULTS SS INNER JOIN WATSON.STUDY S ON SS.STUDYID = S.STUDYID INNER JOIN WATSON.GLOBALANALYTES GS ON SS.ANALYTEID = GS.GLOBALANALYTEID INNER JOIN WATSON.DESIGNSAMPLE DS ON SS.STUDYID = DS.STUDYID AND SS.DESIGNSAMPLEID = DS.DESIGNSAMPLEID INNER JOIN WATSON.DESIGNSUBJECT DT ON SS.STUDYID = DT.STUDYID AND DS.DESIGNSUBJECTID = DT.DESIGNSUBJECTID INNER JOIN WATSON.DESIGNSUBJECTTREATMENT DST ON SS.STUDYID = DST.STUDYID AND DS.DESIGNSUBJECTID = DST.DESIGNSUBJECTID LEFT JOIN WATSON.ANALYTICALRUNANALYTES AAT ON SS.STUDYID = AAT.STUDYID AND SS.RUNID = AAT.RUNID INNER JOIN WATSON.CONCENTRATIONUNITS CS ON SS.CONCUNITSID = CS.CONCUNITSID INNER JOIN WATSON.CONFIGTUBECONDITION CN ON DS.TUBECONDITIONKEY = CN.TUBECONDITIONKEY LEFT JOIN WATSON.REASSAYTAG RG ON SS.STUDYID = RG.STUDYID AND SS.ANALYTEID = RG.ANALYTEID AND SS.DESIGNSAMPLEID = RG.DESIGNSAMPLEID WHERE S.STUDYNAME LIKE '%' || :study || '%' AND GS.ANALYTEDESCRIPTION LIKE '%' || :analyte || '%' AND SS.RUNID LIKE '%' || :run_id || '%' AND SS.CONCENTRATION LIKE '%' || :concentration || '%' 该代码在搜索项不输入runid时不显示RUNID为空的值,需要怎么修改
03-08
<think>嗯,用户给了一个SQL查询的问题,说当不输入run_id时,查询结果不显示RUNID为空的值。需要怎么修改呢?我得仔细看看这个SQL语句的结构。 首先,用户提供的SQL中有多个JOIN操作,特别是涉及到WATSON.ANALYTICALRUNANALYTES AAT这个表的LEFT JOIN。不过问题可能出在这里,因为即使LEFT JOIN,如果后面的ON条件中有SS.RUNID = AAT.RUNID,当RUNID为空时,可能无法匹配到任何记录,导致结果被过滤掉。 不过用户的问题描述是当不输入run_id时,不显示RUNID为空的值。也就是说,在搜索条件中如果没有输入run_id参数,应该包括那些RUNID为空的记录,但现在却被排除在外了。这可能是因为在WHERE子句中的条件SS.RUNID LIKE '%' || :run_id || '%',当:run_id为空时,这个条件变成SS.RUNID LIKE '%%%',也就是SS.RUNID LIKE '%',这应该匹配所有非空的RUNID,但可能不会包括RUNID为NULL的记录。不过根据SQL的逻辑,LIKE '%'会匹配任何非NULL的字符串,而NULL不会被匹配,所以当用户没有输入run_id时,查询中的SS.RUNID LIKE '%'会排除掉RUNID为NULL的行。 但是原问题中的WHERE条件里,用户可能希望当不输入run_id时,返回所有记录,包括RUNID为NULL的。这时候,可能需要修改WHERE条件中的SS.RUNID部分,使其在:run_id为空时,允许SS.RUNID为NULL或者符合其他条件。 不过原问题中提到“在搜索项不输入runid时不显示RUNID为空的值”,这可能意味着当用户没有输入run_id时,查询结果中RUNID为空的记录没有被包含进去。所以需要调整条件,让当:run_id为空时,SS.RUNID可以是任何值,包括NULL。但当前的条件是SS.RUNID LIKE '%',当:run_id为空时,这个条件变成SS.RUNID LIKE '%',而LIKE '%'在SQL中不会匹配NULL值。所以这时候,即使使用LEFT JOIN,如果WHERE条件中的SS.RUNID需要满足LIKE,那么NULL会被排除。 所以解决办法可能是在WHERE条件中,当:run_id为空时,允许SS.RUNID为NULL或者符合LIKE条件。也就是说,将原来的SS.RUNID LIKE '%' || :run_id || '%'改为:当:run_id为空时,不限制SS.RUNID,或者允许SS.RUNID IS NULL。 在SQL中,可以这样改写条件: ( (:run_id IS NULL AND SS.RUNID IS NOT NULL ) OR SS.RUNID LIKE '%' || :run_id || '%' ) 不过这样可能有问题,或者更准确的是: ( (:run_id IS NULL) OR SS.RUNID LIKE '%' || :run_id || '%' ) 这样当:run_id为空时,条件为真,不管SS.RUNID是什么值,包括NULL。但要注意,在SQL中,当使用OR条件时,如果左边的条件为真,右边的不会被评估。所以当:run_id为空时,整个条件为真,所以所有记录都会被包括,无论SS.RUNID是否为NULL。 不过原来的WHERE子句中的其他条件可能也会影响结果。例如,用户的问题可能出现在ANALYTICALRUNANALYTES表的LEFT JOIN上,如果AAT的某些条件导致结果被过滤。 或者,问题可能出在JOIN条件上。比如,在LEFT JOIN WATSON.ANALYTICALRUNANALYTES AAT时,ON条件中有SS.RUNID = AAT.RUNID。如果SS.RUNID是NULL的话,这个JOIN条件可能不会匹配到任何记录,导致AAT中的字段为NULL。但可能这不会影响主表中的记录,因为LEFT JOIN会保留左表(即SAMPLERESULTS SS)的所有记录,即使右表中没有匹配的行。 不过用户的问题是在不输入run_id时,不显示RUNID为空的记录。这可能是因为在WHERE子句中,当用户不输入run_id时,SS.RUNID LIKE '%',这会排除RUNID为NULL的记录。因此,需要将WHERE条件中的SS.RUNID部分改为允许NULL的情况。 正确的修改应该是将SS.RUNID LIKE '%' || :run_id || '%'改为: ( (:run_id IS NULL) OR SS.RUNID LIKE '%' || :run_id || '%' ) 这样当:run_id为空时,条件成立,允许所有SS.RUNID的值,包括NULL。而如果:run_id有值,则按LIKE匹配。 因此,在原始SQL的WHERE子句中,原来的条件: SS.RUNID LIKE '%' || :run_id || '%' 应该改为: ( (:run_id IS NULL OR SS.RUNID IS NULL) OR SS.RUNID LIKE '%' || :run_id || '%' ) 或者更准确的是: ( (:run_id IS NULL) OR SS.RUNID LIKE '%' || :run_id || '%' ) 因为当:run_id为空时,无论SS.RUNID是否为NULL,都会被包括进来。但LIKE '%'不会匹配NULL,所以需要用OR条件来覆盖这种情况。例如: ( (:run_id IS NULL) OR SS.RUNID LIKE '%' || :run_id || '%' ) 或者,更精确地处理可能的情况,当:run_id为空时,允许SS.RUNID为任何值(包括NULL),这可能通过将条件改为: ( (:run_id IS NULL) OR SS.RUNID LIKE '%' || :run_id || '%' ) 这样,当用户不输入run_id时,即:run_id为NULL或者空字符串,条件为真,不进行过滤,从而保留所有SS.RUNID的记录,包括NULL。 不过原问题中的参数可能绑定方式可能有不同,比如如果:run_id是空字符串,那么LIKE '%%%'会变成LIKE '%',此时同样会排除SS.RUNID为NULL的记录。因此,正确的做法是当参数为空时,允许SS.RUNID为任何值,包括NULL,这时候应该调整WHERE条件中的SS.RUNID部分为: AND ( (:run_id IS NULL OR :run_id = '') OR SS.RUNID LIKE '%' || :run_id || '%' ) 或者,更简洁的写法: AND SS.RUNID LIKE '%' || COALESCE(:run_id, '') || '%' 但这样当:run_id为空时,会变成SS.RUNID LIKE '%%%',即SS.RUNID LIKE '%',仍然无法匹配NULL值。所以这并不能解决问题。因此,正确的做法是当:run_id为空时,不应用这个条件,即使用条件判断: AND ( ( :run_id IS NULL ) OR SS.RUNID LIKE '%' || :run_id || '%' ) 这样,当:run_id为空时,条件为真,不进行过滤,因此保留所有SS.RUNID的值,包括NULL。 所以,在原始查询的WHERE子句中,将原来的: SS.RUNID LIKE '%' || :run_id || '%' 改为: ( :run_id IS NULL OR SS.RUNID LIKE '%' || :run_id || '%' ) 同样的逻辑可能适用于其他类似的过滤条件,比如CONCENTRATION等,但用户的问题只提到run_id的情况,所以只需要修改这个部分。 总结,修改后的WHERE子句中的SS.RUNID的条件部分应该变成允许当:run_id为空时,不进行过滤,从而包括所有RUNID的记录,包括NULL。</think>这个问题的核心在于处理`RUNID`为`NULL`时的查询条件。当前查询使用`SS.RUNID LIKE '%' || :run_id || '%'`作为过滤条件,当用户不输入`run_id`参数时(即`:run_id`为空),该条件会转换为`SS.RUNID LIKE '%'`,这会排除所有`RUNID`为`NULL`的记录。 ### 修改方案: 将`WHERE`子句中关于`SS.RUNID`的条件改为动态条件判断: ```sql WHERE S.STUDYNAME LIKE '%' || :study || '%' AND GS.ANALYTEDESCRIPTION LIKE '%' || :analyte || '%' AND ( -- 新增条件判断 :run_id IS NULL OR SS.RUNID LIKE '%' || :run_id || '%' ) AND -- 此处改为动态条件 SS.CONCENTRATION LIKE '%' || :concentration || '%' ``` ### 修改说明: 1. **动态条件判断** 使用`(:run_id IS NULL OR SS.RUNID LIKE ...)`结构: - 当用户未输入`run_id`(即`:run_id`为`NULL`)时,条件`:run_id IS NULL`为真,整个条件成立,此时查询**不限制**`RUNID`,包括`RUNID`为`NULL`的记录。 - 当用户输入`run_id`时,仅筛选符合`SS.RUNID LIKE '%值%'`的记录。 2. **其他字段的扩展** 如果其他参数(如`:concentration`)需要类似逻辑,可参照此模式修改: ```sql ( :concentration IS NULL OR SS.CONCENTRATION LIKE ... ) ``` ### 完整修改后代码: ```sql SELECT -- 字段列表保持不变 FROM -- JOIN部分保持不变 WHERE S.STUDYNAME LIKE '%' || :study || '%' AND GS.ANALYTEDESCRIPTION LIKE '%' || :analyte || '%' AND ( :run_id IS NULL OR SS.RUNID LIKE '%' || :run_id || '%' ) AND -- 修改此处 ( :concentration IS NULL OR SS.CONCENTRATION LIKE '%' || :concentration || '%' ) -- 可选:其他字段同理 ``` ### 数学表达式的应用说明: 此问题中虽然没有直接涉及数学计算,但可以通过以下不等式理解逻辑条件的变化: $$ \begin{cases} \text{原条件} & \Rightarrow SS.RUNID \in \{ x \mid x \text{包含} :run\_id \} \\ \text{新条件} & \Rightarrow \begin{cases} SS.RUNID \in \{ x \mid x \text{包含} :run\_id \}, & \text{if } :run\_id \neq \text{NULL} \\ \text{无限制}, & \text{if } :run\_id = \text{NULL} \end{cases} \end{cases} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值