• 王道p18 第12题假设 A中的 n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素:否则输出-1


     视频讲解在:👇

    p18 第12题 c语言实现王道数据结构课后习题_哔哩哔哩_bilibili

    从前向后扫描数组元素,标记出一个可能成为主元素的元素 Num。然后重新计数,确认 Num 是否是主元素。

    我们可分为以下两步:
    1.选取候选的主元素。依次扫描所给数组中的每个整数,将第一个遇到的整数 Num 保存到c中,记录 Num 的出现次数为 1:若遇到的下一个整数仍等于 Num,则计数加 ,否则计数减 1;当计数减到 0时,将遇到的下一个整数保存到c 中,计数重新记为 1,开始新一轮计数,即从当前位置开始重复上述过程,直到扫描完全部数组元素。

    2.判断 c中元素是否是真正的主元素。再次扫描该数组,统计 c 中元素出现的次数,若大于n/2,则为主元素;否则,序列中不存在主元素。

    让我们来看一下代码该如何实现

    1. int majority(int a[], int n)
    2. {
    3. int i = 0;
    4. int c = 0;//c用来保存候选主元素,count用来计数
    5. int count = 1;
    6. c = a[0];//设置a[0]为候选主元素
    7. for (i = 1; i < n; i++)//查找候选主元素
    8. {
    9. if (a[i] == c)//对a中的候选主元素计数
    10. count++;
    11. else
    12. if (count > 0)//处理不是候选主元素的情况
    13. count--;
    14. else//更换候选主元素,重新计数
    15. {
    16. c = a[i];
    17. count = 1;
    18. }
    19. }
    20. if(count>0)//统计候选主元素的实际出现次数
    21. for (i = 0, count = 0; i < n; i++)
    22. {
    23. if (a[i] == c)
    24. count++;
    25. }
    26. if (count > n / 2)//确认候选主元素
    27. return c;
    28. else//不存在主元素
    29. return -1;
    30. }

    完整测试代码

    1. #include<stdio.h>
    2. int a[8] = { 0,5,5,3,5,7,5,5};
    3. int n = 8;
    4. int majority(int a[], int n)
    5. {
    6. int i = 0;
    7. int c = 0;//c用来保存候选主元素,count用来计数
    8. int count = 1;
    9. c = a[0];//设置a[0]为候选主元素
    10. for (i = 1; i < n; i++)//查找候选主元素
    11. {
    12. if (a[i] == c)//对a中的候选主元素计数
    13. count++;
    14. else
    15. if (count > 0)//处理不是候选主元素的情况
    16. count--;
    17. else//更换候选主元素,重新计数
    18. {
    19. c = a[i];
    20. count = 1;
    21. }
    22. }
    23. if(count>0)//统计候选主元素的实际出现次数
    24. for (i = 0, count = 0; i < n; i++)
    25. {
    26. if (a[i] == c)
    27. count++;
    28. }
    29. if (count > n / 2)//确认候选主元素
    30. return c;
    31. else//不存在主元素
    32. return -1;
    33. }
    34. int main()
    35. {
    36. int ret = majority(a, n);
    37. if (ret != -1)
    38. printf("中位数为%d", ret);
    39. else
    40. printf("未找到");
    41. return 0;
    42. }

    用a[8]={0,5,5,3,5,1,5,7 }测试结果为

    用a[8] = { 0,5,5,3,5,7,5,5}测试结果为

  • 相关阅读:
    创新型中小企业认定条件有哪些?
    16:00面试,16:06就出来了,问的问题有点变态。。。
    关于数据中心的设计方案,数据中心网络规划设计
    ubuntu20.04下源码编译colmap
    TikTok美国市场爆品:美牙仪一周售出3.36万单,GMV近百万刀
    【PickerView案例13-应用程序对象介绍 Objective-C语言】
    【深度学习】Python 快速入门
    【多线程】常见面试题
    Codeforces Round 924 (Div. 2)---->B. Equalize
    Unity的配置文件在安卓路径下使用的方法
  • 原文地址:https://blog.csdn.net/m0_46702681/article/details/134275590