贪心算法实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一分治与递归算法的应用

一、实验目的

1.掌握分治算法的基本思想(分-治-合)、技巧和效率分析方法。

2.熟练掌握用递归设计分治算法的基本步骤(基准与递归方程)。

3.学会利用分治算法解决实际问题。

二、实验内容

1.问题描述:线性时间选择

给定n个元素和一个整数k,要求用O(n)时间找出这n个元素中第k小元素。2.算法描述:

Stept1:数据的保存,首先将数据保存到数组e[num]中,并输入k值。

Stept2:选择第一个数据作为分界数据,将比它小的数据储存在它的左边,比它大的储存在右边,这样左右子集就是原问题的两个独立子问题,在用同样的方法解决这些子问题,直到每个子集只有一个数据,就完成了全部的排序。

Stept3:改写快速排序,记一趟快速排序后,分解出左子集中的元素个数为nleft,这选择问题是以下几种情况:

(1)nleft=k-1,则分界数据就是选择问题的解。

(2)nleft>k-1,则选择问题的解继续在左子集中找。

(3)nleft

这样问题的规模就减小了。

3.测试数据

5 12 23 10 45 92 3 30

K值:3

4实验结果如图:

5关键代码:

int partition(int e[],inti,int j)

{

int tag=e[i];//用第1个记录作为基准'

while(i

{ //从区间两端交替向中间扫描,直至i=j为止

while(i=tag)

j--; //从右向左扫描

e[i]=e[j];

while(i

i++;

e[j]=e[i];

}

e[i]=tag;//基准记录已被最后定位

return i;

}

intSeltct(int element[],intlw,inthi,int k)

{

if(lw==hi)

return element[lw];

int q=partition(element,lw,hi);//调用quicksort里面的partition, q指向参考数intnleft=q-lw+1; // l为左数组长度

if(k==nleft)

return element[q];

if(k

returnSeltct(element,lw,q,k);

if(k>nleft)

returnSeltct(element,q+1,hi,k-nleft);

}

void main()

{

int i=1;

intnum;

int k;

intcn;

cout<<"please input the num of element"<

cin>>num;

cout<<"please input the elements:"<

int *e=new int[num];

while(i<=num)

{

cin>>cn;

e[i]=cn;

i++;

}

cout<<"请输入K值";

cin>>k;

int mink=Seltct(e,1,num,k);

cout<<"the k min num is:"<

}

相关文档
最新文档