贪心算法实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 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:"< }