下面这段代码是在10个数中,找出相同的两个数。 我总感觉逻辑有点问题,请帮我指出,并补充更好的算法。谢

[复制链接]
查看11 | 回复4 | 2011-1-24 16:28:18 | 显示全部楼层 |阅读模式
这个算法类似冒泡,复杂度最差是N^2。可以用先排序,再遍历的方式,时间复杂度平均的话是NlogN+N。当然最快的方法是使用Hash,时间复杂度是N,这个是用空间复杂度换时间复杂的的方法。如果考虑先排序,数据量小的话,可以用这种类似冒泡的方法,或者插入排序。如果数据量大但内存可以放下的话,可以考虑使用快排的方式先排序,后遍历一遍。如果数据量达到内存都放不下的话,那可以使用外排,比如归并的方式先排序,然后遍历一遍,归并排序可以考虑多机并行计算提升效率。
回复

使用道具 举报

千问 | 2011-1-24 16:28:18 | 显示全部楼层
这个代码是没有逻辑问题的。只是在表述上还是有点繁琐。比如可以不用变量k,temp。而且我认为有一种更为简便的算法。我认为内循环中不需要从零开始,可以从i+1开始.具体代码如:void main( ){
int a[10] = {2, 3, 5, 4, 6, 1, 11, 23, 11, 12};
int i, j;
回复

使用道具 举报

千问 | 2011-1-24 16:28:18 | 显示全部楼层
int a[10]={2,3,5,4,6,1,11,23,11,12}; int i,j,k=0; for(i=0;i<9;i++){//俩俩比较for(j=i+1;j<10;j++){ if(a==a[j]){
k=j;
break;//已找到相同的跳出第二层
}
}
回复

使用道具 举报

千问 | 2011-1-24 16:28:18 | 显示全部楼层
void main(){
int a[10]={2,3,5,4,6,1,11,23,11,12};
int k=0; for(int i=1;i<10;i++){ for (int j=0;j<i;j++){ if(a==a[j]) { k=j; break;}}}printf("
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行