C语言在数组中快速找到指定的数的位置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言在数组中快速找到指定的数的位置相关的知识,希望对你有一定的参考价值。
如何在一个数组(数组元素很多)中快速找到指定数据(在该数组中只出现一次)在数组中的位置,不要用循环查询,要求查询次数越少越好,效率要高。求大神指导!
参考技术A int main(void)int aiNum[10] = 1,23,34,22,33,44,55,31,24,90;
int i;
int number;
printf("input NUMBER");
scanf("%d",&number);
for(i=0;i<10;i++)
if(number == a[i])
break;
if(i>9)
printf("NOT FOUND NUMBER\n");
else
printf("LOCATION:[%d]\n",i);
return(0);
追问
不要用循环查询的方式啊,如果我有几千个元素,有没有可能在50次查询次数以内找到指定的值?
c语言:如果有一大堆数,怎么找出其中出现次数最多的那个
c语言编程题:如果有一大堆数,怎么找出其中出现次数最多的那个?
请说一下编程思路什么吧,我想不出什么实现办法,我是新手,就说哈有啥实现办法吧
我等会儿自己在vc上练练。
请大神给个思路吧。。。
数据结构:用一个可变长度的动态结构数组(结构类型中有两个成员,一是被统计的数,另一是这个数出现的频次),或用两个整形数组,或动态表。
算法思路:
对于每个要统计的数,首先看是不是已存在于数组中,如果在,其对应的频次数加1;如果不在,添在数组中,频次数为1。
由于这一大堆数的组成是未知的(如,有100个数,其中3有10个,9有80个,54有10个,那么结果只要用数组中的三个元素就保存了,频次最高的是9;但也有另一种可能:1~100中每个数都出现一次,那就要100个元素了),同时这一大堆数的总个数也是未知的,所以要考虑可变长度的动态存储结构,首选就是动态链表了。当然也可以考虑动态数组,一开始数组有个初始大小(如100),运行时如果不够大,则在原数组大小基础上增加一定长度(如100)建立新数组,将原数组复制到新数组,删除原数组。
统计完成后,在数组中查找频次最大的元素即可。
下述参考程序,用结构数组实现。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <memory.h>
struct Node
int item; //数据
int freq; //出现次数
;
struct List
struct Node* data;
int occupied; //被占用的数
int size; //空间总数
;
void statistic(struct List* , int );
struct Node maxFreq(struct List*);
void main()
//准备数据结构并初始化
struct List dataList;
dataList.data =(struct Node*) malloc(100 * sizeof (struct Node));
memset(dataList.data, 0, 100 * sizeof (struct Node));
dataList.size = 100;
dataList.occupied = 0;
/*开始统计*/
srand((unsigned) time(NULL)); //初始化随机数
int i;
int d;
for (i = 0; i < 1000; i++) //生成1000个50以内的随机数
d = rand() % 50;
//printf(" %d\\n", d ); //打印
//统计每个数出现的频度
statistic(&dataList, d);
struct Node result=maxFreq(&dataList);
free(dataList.data);
printf("出现频度最大的数:%d,出现次数:%d",result.item,result.freq);
void statistic(struct List *list, int d)
int i = 0;
for (; i < list->occupied; i++)
if (list->data[i].item == d)
list->data[i].freq += 1; //数据已在表,频度加1
return;
//数据不在表中
if (i >= list->occupied)
if (list->size <= list->occupied) //空间不够
list->size+=100;//增加100个空间;
struct Node *temp= malloc(list->size * sizeof (struct Node));
memcpy(temp,list->data,list->occupied * sizeof (struct Node));
free(list->data);
memset(&(list->data[list->occupied]),0, 100 * sizeof (struct Node));
list->data[list->occupied].item = d;
list->data[list->occupied].freq += 1;
list->occupied++;
struct Node maxFreq(struct List* list)
struct Node temp;
temp.freq=list->data[0].freq;
temp.item=list->data[0].item;
int i=1;
for (; i < list->occupied; i++)
if (temp.freq<list->data[i].freq)
temp.freq=list->data[i].freq;
temp.item=list->data[0].item;
return temp;
用循环读入每一个数,
如果数组中不存在这个数,就放入数组,计数为1;
如果数组中存在这个数,计数加1;
然后找出计数最大的那个数。本回答被提问者和网友采纳
以上是关于C语言在数组中快速找到指定的数的位置的主要内容,如果未能解决你的问题,请参考以下文章
如何用c语言从一组给定数中找到一个数或者几个数的和使其值最接近指定的数
如何用c语言从一组给定数中找到一个数或者几个数的和使其值最接近指定的数