高分~~有人能把这个算法再优化一下吗?

来源:百度知道 编辑:UC知道 时间:2024/06/01 05:04:53
用一个长度为SIZE的数组记录随机数,随机数的范围为rand() % SIZE2 + 1;
然后统计每个数的出现次数.
total是我加入的计算执行了循环次数的计数器,以这个来衡量算法的复杂性,有人能把这个total值控制到最低吗
当然不能减去初始化数组与显示数组的循环次数,除非你有更好的初始化和现实方法咯

百度分对我没啥用,所以我每次问问题都会出200分悬赏的,现在先放100分,等期限少于5天的时候我就会加分,每次加50,因为可以加2次,因为我希望看到大家的用心回答.200分谁都有希望获得哦,高手们请多留意本贴!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10
#define SIZE2 10
int main(void)
{
// srand(time(0)); //为了让随机数每次都一样,才能好统计循环次数的总额高低,所以这个最好注释掉
int i,total=0;//total为循环总次数的计数器
int arr[SIZE],NumCount[SIZE2+1]={0}; //NumCount[0]记录0出现的次数,NumCount[1]代表1出现的次数,以此类推

for (i = 0; i < SIZE; i++,total++)
{
arr[i] = rand() % SIZE2 + 1;
printf("%d,",arr[i]);
}

printf("\n");

for(i=0;i<SIZE;i++,total++)
if(0==NumCount[arr[i]]) //判断NumCount[arr[i]]是否为0,如果为0,则这个数字还未曾出现过,所以需要判断,如果非0,则这个数值已经在前面搜索过了,为免造成重复运算而设<

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10
#define SIZE2 10
int main(void)
{
// srand(time(0)); //为了让随机数每次都一样,才能好统计循环次数的总额高低,所以这个最好注释掉
int i,total=0;//total为循环总次数的计数器
int arr[SIZE],NumCount[SIZE2+1]={0}; //NumCount[0]记录0出现的次数,NumCount[1]代表1出现的次数,以此类推

for (i = 0; i < SIZE; i++,total++)
{ arr[i] = rand() % SIZE2 + 1;
printf("%d,",arr[i]);
NumCount[arr[i]]++;
}

printf("\n");

for(i=0;i<=SIZE2;i++,total++)
printf("%d这个值出现了 %d 次。\n",i,NumCount[i]);
printf("总共进行了%d次循环。\n",total);
return 0;
}

1. 如果SIZE2不大的话,桶排序。
2. 如果SIZE2大,考虑先快速排序再统计。

mjl86的算法实际上是桶排序的思想。

就你的这段代码而言,肯定是可以优化的。
我取SIZE=10000, SIZE2=10000,用你的方法,时间为681ms(debug版,我的破电脑上运行),而10000个数排序只需要10ms(同样的环境),当然排序后的统计我没做,但这个时间不会大于排序时间(肯定是线性时间)。

//这么写可以么?