王道书P18 T12(静态顺序表实现)

/**
 * 用顺序表实现 王道P18 T12
 * point:
 * 此题的时间复杂度为 O ( n )
 *     空间复杂度为 O ( n )
 * ①算法思想:
 * 首先创建一个数组count,这个数组的下标用于存储A序列的元素值,数组的值对应着A数组中这个元素出现的次数,
 * 然后找到数组中出现次数最多的元素,如果满足主元素条件则输出数组下标,若不满足,则返回-1。
 *
 * ②数据结构:
 * typedef struct{
 *     int data[MaxSize];
 *     int length;
 * }SqList;
 *
 * ③算法设计
 */

#include <stdio.h>
#include <iostream>
#define MaxSize 100
typedef struct{
    int data[MaxSize];
    int length;
}SqList;

int FindMode(SqList &L,int n){
    //如果这样定义的话:int count[n] 那么数组就定义在了函数栈里面,当n很大时,会出现函数栈溢出的情况,所以这种方式不推荐
    int* count = (int*)malloc(sizeof(int) * n);//用malloc申请是占用在堆空间里的
    //初始化数组
    for(int i = 0;i < n; ++i){
        count[i] = 0;
    }
    for (int i = 0; i < n; ++i) {
        count[L.data[i]]++;
    }
    int ModeCount = count[L.data[0]],Mode = L.data[0];//ModeCount代表众数出现的次数,Mode代表众数
    for (int i = 0; i < n; ++i) {
        if(ModeCount < count[i]){
            ModeCount = count[i];
            Mode = i;
        }
    }
//    if(ModeCount > n / 2)
//        return Mode;
//    else
//        return -1;
        return ModeCount > n / 2 ? Mode : -1;
}

//以下用于测试
void InitList(SqList &L){
    for (int i = 0; i < MaxSize; ++i) {
        L.data[i] = 0;
    }
    L.length = 0;
}

void PrintList(SqList L){
    for (int i = 0; i < L.length; ++i) {
        printf("%d ",L.data[i]);
    }
    printf("\n");
}

int main(){
    SqList L = {{0,5,5,3,5,7,5,5}, 8};
    PrintList(L);
    printf("%d",FindMode(L,8));
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值