堆排序算法

xiaoxiao2025-07-18  8

找出一个序列中前M个大值对应的索引(堆排序实现)

//用数组测试堆算法,不改变数组顺序,用数组下标成堆 #include <stdio.h> void push(float a[],int tmp[],int lenth) { int t,tlen=lenth; while(0!=tlen) { if(a[tmp[tlen]]>a[tmp[(tlen-1)/2]]) { t=tmp[tlen]; tmp[tlen]=tmp[(tlen-1)/2]; tmp[(tlen-1)/2]=t; } tlen=(tlen-1)/2; } } //最大值出堆 void pop(float a[],int tmp[],int lenth) { int max,t,tlen=0; t=tmp[lenth]; tmp[lenth]=tmp[0]; tmp[0]=t; while(tlen*2<(lenth-1)) { max = a[tmp[tlen*2+1]]>a[tmp[tlen*2+2]]?(tlen*2+1):(tlen*2+2); if(max==lenth)max--; if(a[tmp[tlen]]<a[tmp[max]]) { t=tmp[max]; tmp[max]=tmp[tlen]; tmp[tlen]=t; } tlen = max; } } void maxnp(float* x,int N,int* maxnp_id,int M) { int tmp[N],b[N]; int i; //初始化 for(i=0;i<N;i++) { b[i]=tmp[i]=i; } //成最大堆 for(i=1;i<N;i++) { push(x,tmp,i); } //出堆,取M个最大值 for(i=1;i<=M;i++) { b[i-1]=tmp[0]; pop(x,tmp,N-i); } for(i=0;i<M;i++) { maxnp_id[i] = b[i]; } } int main() { float x[5]={3.0,2.0,4.0,1.0,5.0}; int i; int maxnp_id[3] = {0}; maxnp(x,5,maxnp_id,3); for(i=0;i<3;i++) { printf("%d ",maxnp_id[i]); //b[i] } printf("\n"); return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-5033303.html

最新回复(0)