/**
* 用顺序表实现 王道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;
}
王道书P18 T12(静态顺序表实现)
最新推荐文章于 2024-05-22 19:31:00 发布