本文为原创,如需转载,请注明作者和出处,谢谢!
第一种算法是最容易想到的,就是利用快速排序的思想,将一个数组分成以某一个数X为轴,左边的所有的数都比X小,而右边的数都比X大。但我快速排序不同的是,在这个算法中只考虑X的一边,而不是两边都考虑。
如果X的位置是i,那么要得到第k个数,如果k<=i, 那么这个数一定在i的左边,否则在i的右边。
源码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include<stdio.h>
#include<stdlib.h>
intnew_random(intmin,intmax)
{
return(min+(int)(((float)rand()/RAND_MAX)*(max-min)));
}
voidswap(int*a,int*b)
{
intc=*a;
*a=*b;
*b=c;
}
intpartition(intA[],intp,intr)
{
inti=p-1,j;
for(j=p;j<r;j++)
{
if(A[j]<=A[r])
{
i++;
swap(&A[i],&A[j]);
}
}
swap(&A[i+1],&A[r]);
returni+1;
}
intrandomize_partition(intA[],intp,intr)
{
inti=new_random(p,r);
swap(&A[i],&A[r]);
returnpartition(A,p,r);
}
//第一种算法
intrandomized_select(intdata[],intp,intr,intk)
{
if(k>(r-p+1))return0;
if(p==r)returndata[p];
inti=randomize_partition(data,p,r);
//inti=partition(data,p,r);//不好使,死循环,必须用随机数,在第二步时总是在最大数处划分
intcount=i-p+1;
if(k<=count)
returnrandomized_select(data,p,i,k);
else
returnrandomized_select(data,i+1,r,k-count);
}
另外一种对这种算法做了一下改进,即将数组每5个数一组进行排序,然后取得它的中位数,再对这些中位数进行排序。然后先出的轴X最比较好的,因此X的左边和右边的数总是很平均,所以平均查找速度更快。算法如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->voidquicksort(intdata[],intb,inte)
{
if(b<e)
{
intk=partition(data,b,e);
quicksort(data,b,k-1);
quicksort(data,k+1,e);
}
}
intpartition1(intA[],intp,intr,intx)
{
inti=p-1,j;
for(j=p;j<=r;j++)
{
if(A[j]<=x)
{
i++;
swap(&A[i],&A[j]);
}
}
A[i+1]=x;
returni+1;
}
//第二种算法
intselect_new(intdata[],intp,intr,intk)
{
if(r-p<75)
{
quicksort(data,p,r);
returndata[p+k-1];
}
inti;
for(i=0;i<=(r-p-4)/5;i++)
{
quicksort(data,p+5*i,p+5*i+4);
swap(&data[p+5*i+2],&data[p+i]);
}
intx=select_new(data,p,p+(r-p-4)/5,(r-p-4)/10);//得到更好的轴X
i=partition1(data,p,r,x);
intcount=i-p+1;
if(k<=count)
returnselect_new(data,p,i,k);
else
returnselect_new(data,i+1,r,k-count);
}
intmain()
{
intdata[]={3,1,7,34,8,11,678,12,-1,100};
printf("%d\n",randomized_select(data,0,9,2));
intdata1[]={3,1,7,34,8,11,678,12,-1,100};
printf("%d\n",select_new(data1,0,9,2));
return0;
}
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!《银河系列原创教程》发布《Java Web开发速学宝典》出版,欢迎定购
分享到:
相关推荐
本文就K-均值聚类算法的聚类结果依赖于初始中心,而且经常收敛于局部最优解,而非全局最优解,以及聚类类别数K需要事先给定这两大缺憾展开研究。提出了分别解决这两个问题的算法各一个首先,本文将Hae-Sang等人的快速K-...
首先,为了能获得K-means聚类的初始簇数,利用凝聚层次聚类法对数据集进行聚类,并用轮廓系数对聚类结果进行初步评价,将获得数据集的簇数作为K-means算法的初始簇中心进行聚类;其次,为了能适应于海量数据的聚类...
基于工业领域广泛用到的Hadoop分布式计算平台,使用Canopy+K-means算法对手写数字进行聚类研究.针对传统Canopy算法初始阈值的确定问题,引入"最大最小化原则"确定初始阈值,计算得到K-means算法所需的初始聚类中心点....
突发性事件中应急物资调度方案最优化问题是典型的车辆路径规划(VRP)问题。对于大规模的VRP问题求解,...仿真实验结果表明,方法获得了较好的调度方案,而且单个运输车辆服务的需求节点个数越多,方法的优势越明显。
在K-SVD字典学习算法的基础上,改变稀疏编码中误差约束为非零元个数约束来进行字典学习。在实验的基础上分析了使用不同非零元个数去噪时对峰值信噪比的影响,提出分别针对低噪图像和高噪图像采用两个固定非零元个数...
该算法针对数据对象的分布密度以及计算最近两点的垂直中点方法来确定k个初始聚类中心, 再结合均衡化函数对聚类个数进行优化, 以获得最优聚类。采用标准的UCI数据集进行实验对比, 发现改进后的算法相比传统的算法有较...
传统K-均值聚类算法虽然收敛速度快,但存在聚类数k无法预先确定,并且算法对初始中心点敏感的缺点。针对上述缺点,提出了基于密度期望和聚类有效性Silhouette指标的K-均值优化算法。给出了基于密度期望的初始中心点...
然而其聚类的随机性却给定位带来极大的不稳定性,对此提出使用两步聚类算法进行优化,根据AIC准则自动得到最优的聚类个数;针对最邻近算法定位误差大的情况,使用相关系数法确定相似度最高的子库,再估计最终位置。...
基于协同过滤的推荐系统算法研究项目源码 协同过滤算法研究 [摘要] 随着“大数据”的出现,人们在庞大的数据面前更是显得束手无策。信息过载的问题成为了让人们头疼的事情。社会信息超过了个人或系统所能接受、处理...
K-means算法所使用的聚类准则函数是将数据集中各个簇的误差平方值直接相加而得到的,不能有效处理簇的密度不均且大小差异较大的数据集。为此,将K-means算法的聚类准则函数定义为加权的簇内标准差之和,权重为簇内...
最后,设计了最小跳数路由算法获得各簇头到Sink节点的最小跳数路由。采用NS2仿真工具对该方法进行仿真,实验表明:该方法具有较长的网络生命周期,较其它方法延长生命周期30%以上,具有较大的优越性。
选取戴维森-堡丁指数来确定最佳聚类数,并通过全局K-means聚类算法将主成分分析得到的4个主成分聚成3类,然后采用相关系数法从各类片段库中选取具有代表性的运动学片段,从而构建出郑州市乘用车典型循环工况(ZZ_DC)。...
针对如何确定最优聚类数K这一关键问题,在彩色图像的HSI颜色空间中,以马氏距离为距离测度进行K均值聚类,从信息论的角度出发,利用最大加权熵定义了一个目标函数,将最优聚类个数K的求取转换为目标函数的寻优,实现...
环境下的动态交通最优路径算法是ITS研究中的一个重要课题,能够 帮助出行者节省出行时间和燃油开支,提高现有交通设施的利用效 率,减少汽车温室气体的排放,保护环境等,具有一定的理论意义和 实际应用价值。 本文...
音频具有数据量大、维数高等特点,直接进行音频检索会造成“特征维数灾难”,因此有必要从音频提取最能表现音频特征的音频帧。提出一种基于模糊粗糙集模型(Fuzzy Rough Set Model,FRSM)的音频数据约简算法,根据...
针对目前单一路径路由交换机制的问题,引出多下一跳路由交换机制,并在路由交换协同设计的基础上分析讨论了到达分组可选输出端口个数k的取值,基本思路是路由层面分析路由表转发表对k,取值要求特点,交换层面基于Mp...
计算机控制课程设计 院系: 电气工程学院 专业: 自动化专业 班级: 学号: 姓名: PID控制算法的MATLAB仿真研究 一、实验目的 1)通过本课程设计进一步巩固PID算法基本理论以及数字控制器实现的认识和掌握,归纳和总结PID...
针对受限波尔茨曼机用于协同过滤算法...最后将TimeRBM模型和项目属性聚类方法得到的两种预测结果进行加权融合得到一种高效的混合算法。在基准数据集上的实验结果表明,这种混合的算法有助于提高推荐系统的预测精度。
书的内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找树算法、k-d树和配对堆等。本书适合作为计算机相关专业本科生的数据结构课程和研究生算法分析...