C中数组的频率计数是这个代码有效和高效

我在c中有以下代码用于计算数组中的数字频率:

#define MAX 10 int flag=0; void display(int no,int cnt,int visi[]);//function declaration int main() { int arr[]={1,1,1,2,3,4,2,2,3,1};//asume any array or we can enter from user int visited[MAX]; int i,j,no,cnt=1; clrscr(); for(i=0;i<10;i++)//loop { no=arr[i]; cnt=1; for(j=i+1;j<10;j++) { if(no==arr[j]) cnt++; } display(no,cnt,visited); } return 0; } void display(int no,int cnt,int visited[]) { int static i; int j; if(flag==1) for(j=0;j<=i;j++) { if(visited[j]==no) goto a; } i++; flag=1; printf("\n%d=%d",no,cnt); visited[i]=no; a: } 

请帮助改进我的代码或建议任何其他技术的有效性是这个算法有效和有效,请提供反馈。

您可以先通过合并排序( O(n log n) )对数组进行排序,然后通过单循环计算数字的频率,如下所示:

 int j=0; for( i = 0; i < 9; i++ ) { if (arr[i] == arr[i+1]) cnt++; else { visited[j] = cnt; cnt = 0; j++; } } 

要计算数组中数字的频率,请尝试此代码

 #include  #define MAX 10 int countArray[MAX]; int main() { int arr[]={1,1,1,2,3,4,2,2,3,1},i; for(i=0;i 

你没有明确地说明这一点,但看起来好像你有一个非负数的数组,其值小于MAX

如果已知数字范围,则可以创建计数数组。 访问数组的每个元素一次,并增加该元素的计数。 然后传递计数数组并根据需要输出。

如果有效数字的范围以及count数组的大小很小,则此方法很有效。 (对于visited数组,您遇到同样的问题,其大小与计数数组的大小相同。)

下面的示例使用计数数组实现计数。 该代码还处理超出MINMAX有效范围的值。

 #include  #define MIN 1 #define MAX 10 int main() { int arr[] = {1, 1, 1, 2, 3, 4, 2, 2, 3}; int narr = sizeof(arr) / sizeof(arr[0]); int count[MAX + 1 - MIN] = {0}; int uncounted = 0; int i; for(i = 0; i < narr; i++) { if (arr[i] < MIN || arr[i] > MAX) { uncounted++; } else { count[arr[i] - MIN]++; } } for(i = MIN; i < MAX + 1; i++) { if (count[i - MIN]) { printf("element %d ocurs %d times.\n", i, count[i - MIN]); } } if (uncounted) { printf("%d elements were not accounted for.\n", uncounted); } return 0; } 
 int main() 

是依赖于实现。 你不想使用它,一些编译器不会接受它。

使用

 int main(void) 

代替

 for(i=0;i<10;i++)//loop 

你已经定义了MAX ,所以为什么不在那里使用它。 像这样的东西使代码更难维护。

效率取决于您拥有的输入值。 对于小数字的小数组,这样可以正常工作。