免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: titansword2000
打印 上一主题 下一主题

[算法] 请教一个算法(问题仍未解决,继续请教中...) [复制链接]

论坛徽章:
0
31 [报告]
发表于 2009-05-19 10:00 |只看该作者
因为已经是排好序的了,所以iFindNum就是在第n位置上,即strData[iFindNum]位置,数据是strData[iFindNum].lData,原位置就是strData[iFindNum].iPos

论坛徽章:
0
32 [报告]
发表于 2009-05-19 10:05 |只看该作者
问题是我在一楼贴的代码从打印出来的数据检验来看,现在有两个问题,第一:排序不成功;第二:序列也不对。  一直找不到问题出在哪。

论坛徽章:
0
33 [报告]
发表于 2009-05-19 10:15 |只看该作者
你的排序过程:
for(i=0;i<iArrayNum;i++)
        {lmin=strData.lData;
         iFlag=strData.iPos;

         for(j=i+1;j<iArrayNum;j++)
                {if(strData[j].lData<lmin)
                        {lmin=strData[j].lData;
                         iFlag=strData[j].iPos;
                        }
                }

         strData[iFlag].lData=strData.lData;
         strData[iFlag].iPos=strData.iPos;
         strData.lData=lmin;
         strData.iPos=iFlag;
        }

这个排序的过程是错误的,lmin的处理可以这样,但是你的iPos就不行了,那是原来的偏移,要改也是当前的坐标j,还有最后的将最小值放到合适的位置上也不对,因为你这样会进行一大堆覆盖操作,直接把东西给覆盖掉了,排序肯定不对,实际上如果你那样写是个选择排序那么是个交换的过程。我按照你的思路给一个可行的改变方案

sData temp;
for(i=0;i<iArrayNum;i++)
{
    k=i;
    for(j=i+1;j<iArrayNum;j++)
        if(strData[j].lData<strData[k].lData) k=j;
    if (k!=i)
    {
        temp=strData[k];
        strData[k]=strData;
        strData=temp;
    }
}

论坛徽章:
0
34 [报告]
发表于 2009-05-19 10:23 |只看该作者
M个数中N最小的数
创建个STRUCT用来保存VALUE AND POSiTION , 然后声明个VECTOR<STRUCT>  instance,
遍历M个数,把最小的N个数放到VECTOR里(按大小顺序排放),
其实把 VALUE 和 POSITION 放到MAP里比VECTOR要好些,MAP定位快

论坛徽章:
0
35 [报告]
发表于 2009-05-19 10:27 |只看该作者

回复 #34 houhulou 的帖子

其实差不多,因为map使用红黑树实现的,插入操作的复杂度是O(logm)的,你做m次插入然后再取出前n小的数值其实这个过程时间和直接做一次排序然后取前n个是一样的

论坛徽章:
0
36 [报告]
发表于 2009-05-19 10:34 |只看该作者
做不到M次插入 , 你先做一次比较 如果比最大的还要大, 就不需要插入,MAP里只保存<=N个数

论坛徽章:
0
37 [报告]
发表于 2009-05-19 10:37 |只看该作者

回复 #36 houhulou 的帖子

那我给个两个特殊例子,如果m=n呢,如果是逆序给的呢,这些都要实实在在插入m次的

论坛徽章:
0
38 [报告]
发表于 2009-05-19 10:37 |只看该作者
如果数据特别混乱的话 ,插入删除跟全部插入排序 ,不知道哪个快 ,制不了

论坛徽章:
0
39 [报告]
发表于 2009-05-19 10:44 |只看该作者

回复 #38 houhulou 的帖子

你完全可以试试看,把m开大一点,时间差别很是明显的

论坛徽章:
0
40 [报告]
发表于 2009-05-19 10:45 |只看该作者
感觉有点像count sort
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP