《算法分析》作业6

1. 问题

     求一个数组中第K小的元素。

2. 解析

 

 

 

 

 

 

 

 

 

 

3. 设计

核心代码:

 1 int select(int num[],int p,int r,int k){
 2     int len=r-p+1;
 3     //当前小于等于五个元素直接排序求第k小 
 4     if(len<=5){
 5         sort(num,num+len);
 6         return num[k-1];
 7     }else{
 8         //将数组分组,五个一组
 9         int group=len/5;
10         int m=len-group*5; //剩下的元素赋值给m
11         rep(i,0,group-1){ //分组排序 
12             sort(num+i*5,num+i*5+5);
13             mid[i]=num[i*5+2];
14         }
15         if(m>0){
16             sort(num+group*5,num+group*5+m);
17             mid[group]=num[group*5+m/2];
18             group++;
19         }
20         sort(mid,mid+group);
21         int mm=mid[group/2];
22         int len1=0,len2=0;
23         //用mm把数组分为s1和s2
24         rep(i,p-1,r-1){
25             if(num[i]<mm){
26                 s1[len1++]=num[i];
27             }else s2[len2++]=num[i];
28         }
29         int ans=0;
30         if(k==len1+1) ans=mm;
31         else if(k<=len1) ans=select(s1,1,len1,k);
32         else ans=select(s2,1,len2,k-len1);
33         return ans;
34     }
35 }

4.分析

 

 

 

 

 

5.源码

https://github.com/xiaojunjun601/sfHomework1/blob/master/%E4%BB%A3%E7%A0%81/%E5%88%86%E6%B2%BB%E6%B3%95%E6%B1%82%E7%AC%ACK.cpp

 

posted @ 2021-04-19 17:50  JamZF  阅读(51)  评论(0编辑  收藏  举报