当前位置:   article > 正文

找第二大的数(分治法)

找第二大的数(分治法)
  1. #include<stdio.h>
  2. float a[100];
  3. void TwoMax(int i,int j,float *fmax2,float *fmax1){
  4. float lmax2,lmax1,rmax2,rmax1;
  5. int mid;
  6. if(i==j){
  7. *fmax1=*fmax2=a[i];
  8. } else if(i=j-1){
  9. if(a[i]>a[j]){
  10. *fmax1=a[i];
  11. *fmax2=a[j];
  12. } else{
  13. *fmax1=a[j];
  14. *fmax2=a[i];
  15. }
  16. }else{
  17. mid=(i+j)/2;
  18. TwoMax(i,mid,&lmax2,&lmax1);
  19. TwoMax(mid+1,j,&rmax2,&rmax1);
  20. if(lmax1>rmax1){
  21. if(lmax2>rmax2){
  22. *fmax1=lmax1;
  23. *fmax2=lmax2;
  24. }else
  25. {
  26. *fmax1=lmax1;
  27. *fmax2=rmax1;
  28. }
  29. }else{
  30. if(rmax2>lmax2){
  31. *fmax1=rmax1;
  32. *fmax2=rmax2;
  33. }else{
  34. *fmax1=rmax1;
  35. *fmax2=lmax1;
  36. }
  37. }
  38. }
  39. }
  40. float second(int n){
  41. float max2,max1;
  42. TwoMax(0,n-1,&max2,&max1);
  43. return max2;
  44. }
  45. int main(){
  46. int n, i;
  47. float max2;
  48. printf("请输入数组长度:");
  49. scanf("%d", &n);
  50. printf("请依次输入数组的数:");
  51. for (i = 0; i < n; i++) {
  52. scanf("%f", &a[i]);
  53. }
  54. max2=second(n);
  55. printf("第二大的数为:%.0f\n", max2);
  56. return 0;
  57. }

解析:

这段代码是用来找出数组中第二大的数的。下面逐行解释代码的功能:

  1.  `void TwoMax(int i, int j, float *fmax2, float *fmax1)`:定义了一个名为TwoMax的函数,用来找出数组中两个最大的数。函数的参数包括起始索引i和结束索引j,以及两个最大数的指针fmax2和fmax1。
  2. . `float lmax2, lmax1, rmax2, rmax1;`:定义了四个浮点数变量,用来存储左半部分和右半部分的两个最大数。
  3. . `if (i == j)`:判断i和j是否相等,如果相等,说明只有一个数,将该数赋给fmax2和fmax1。
  4.  `else if (i == j - 1)`:判断i是否等于j-1,如果是,说明只有两个数,比较两个数的大小,将较大的数赋给fmax1,较小的数赋给fmax2。
  5.  `else`:当i和j不满足上述两个条件时,执行else部分的代码。
  6.  `TwoMax(i, mid, &lmax2, &lmax1);`:递归调用TwoMax函数,找出左半部分的两个最大数。
  7.  `TwoMax(mid + 1, j, &rmax2, &rmax1);`:递归调用TwoMax函数,找出右半部分的两个最大数。
  8.  `if (lmax1 > rmax1)`:比较左半部分的最大数和右半部分的最大数的大小。
  9.  `if (lmax2 > rmax1)`:比较左半部分的第二大数和右半部分的最大数的大小。
  10. . `else`:当lmax2不大于rmax1时,将rmax1赋给fmax2。
  11.  `else`:当lmax1不大于rmax1时,将rmax1赋给fmax1。
  12. . `float second(int n)`:定义了一个名为second的函数,用来调用TwoMax函数并返回第二大的数。

这段代码通过递归的方式,将数组分为两半,并分别找出左半部分和右半部分的两个最大数,然后比较这四个数的大小,得到第二大的数。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/561239
推荐阅读
相关标签
  

闽ICP备14008679号