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

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

#include 
#include 
#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;
}

你可能感兴趣的:(王道书第二章综合应用题,数据结构,算法,c语言,c++,蓝桥杯)