排序问题的相关资源

denghui0815 2008-04-16 03:44:28
英文的排序算法分析
http://www.cnblogs.com/mornlee/articles/Computer_Programming_Algorithms_Directory.html

台湾的排序算法分析
http://www.programmer-club.com/pc2020v5/Forum/ShowSameTitleN.asp?URL=N&board_pc2020=general&id=4550

其中有很多归并排序的变形

比如Bitonic Mergesort和Odd-Even Mergesort

这些都可以在归并排序的优化中使用.

但根据主办方的测试方案, IO也计算时间.那么实际上排序的时间应该要比IO的时间小.

所以,必须要注重IO的优化.才能取得好的成绩.

...全文
520 39 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
denghui0815 2008-05-23
  • 打赏
  • 举报
回复
bug 修正

#define XSAVENUM_ITEM(pSave, nSave, nIndex) pSave[nIndex] = (nSave % 10) + '0'; nSave /= 10;

#define XSAVENUM_END(pSave, nSave, nCount) pSave[0] = (nSave % 10) + '0'; pSave[nCount] = '\n'; pSave += nCount + 1;

#define XSAVENUM(pSave, nSave) \
{ \
if(nSave >= 1000000000) \
{ \
XSAVENUM_ITEM(pSave, nSave, 9) \
XSAVENUM_ITEM(pSave, nSave, 8) \
XSAVENUM_ITEM(pSave, nSave, 7) \
XSAVENUM_ITEM(pSave, nSave, 6) \
XSAVENUM_ITEM(pSave, nSave, 5) \
XSAVENUM_ITEM(pSave, nSave, 4) \
XSAVENUM_ITEM(pSave, nSave, 3) \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 10) \
} \
else if(nSave >= 100000000) \
{ \
XSAVENUM_ITEM(pSave, nSave, 8) \
XSAVENUM_ITEM(pSave, nSave, 7) \
XSAVENUM_ITEM(pSave, nSave, 6) \
XSAVENUM_ITEM(pSave, nSave, 5) \
XSAVENUM_ITEM(pSave, nSave, 4) \
XSAVENUM_ITEM(pSave, nSave, 3) \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 9) \
} \
else if(nSave >= 10000000) \
{ \
XSAVENUM_ITEM(pSave, nSave, 7) \
XSAVENUM_ITEM(pSave, nSave, 6) \
XSAVENUM_ITEM(pSave, nSave, 5) \
XSAVENUM_ITEM(pSave, nSave, 4) \
XSAVENUM_ITEM(pSave, nSave, 3) \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 8) \
} \
else if(nSave >= 1000000) \
{ \
XSAVENUM_ITEM(pSave, nSave, 6) \
XSAVENUM_ITEM(pSave, nSave, 5) \
XSAVENUM_ITEM(pSave, nSave, 4) \
XSAVENUM_ITEM(pSave, nSave, 3) \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 7) \
} \
else if(nSave >= 100000) \
{ \
XSAVENUM_ITEM(pSave, nSave, 5) \
XSAVENUM_ITEM(pSave, nSave, 4) \
XSAVENUM_ITEM(pSave, nSave, 3) \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 6) \
} \
else if(nSave >= 10000) \
{ \
XSAVENUM_ITEM(pSave, nSave, 4) \
XSAVENUM_ITEM(pSave, nSave, 3) \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 5) \
} \
else if(nSave >= 1000) \
{ \
XSAVENUM_ITEM(pSave, nSave, 3) \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 4) \
} \
else if(nSave >= 100) \
{ \
XSAVENUM_ITEM(pSave, nSave, 2) \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 3) \
} \
else if(nSave >= 10) \
{ \
XSAVENUM_ITEM(pSave, nSave, 1) \
XSAVENUM_END (pSave, nSave, 2) \
} \
else \
{ \
XSAVENUM_END (pSave, nSave, 1) \
} \
}
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
第一个 haojn
第二个 我
第三个 zm0011

拿CPU都是付出的结果.:)
zm0011 2008-04-26
  • 打赏
  • 举报
回复
我发现有楼上的两位参赛,要得CPU比较费劲啊,你们也歇歇一两次吧,给其他同学一个机会。一个人用那么多CPU,室内温度高,噪音也大。
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
haojn 你的代码用\r做分割 导致了异常的问题
我的测试数据里只有\n
haojn 2008-04-26
  • 打赏
  • 举报
回复
我生成数据用的就是这个:
http://topic.csdn.net/u/20080410/11/fbe06f54-70c8-402a-bcd0-c78538f2a22b.html
初始种子都是12345

发现我的程序有个小BUG,如果文件不是N+1行会直接溢出,而不是友善的提示一个错误。缓冲合并的时候没有加溢出的判断
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
我的源码可以直接生成测试数据
你运行 XSort 100.in test 1000000
就可以生成100万的测试数据了
zm0011 2008-04-26
  • 打赏
  • 举报
回复
啊,这次我的程序出错了,辉辉,把你100万测试数据的生成程序贴上来,我试试。

佳男的程序应该也很快,特别是文档写得很有内容,正在咀嚼。

学习,学习,再学习。不然6月份我又要当尾巴了
haojn 2008-04-26
  • 打赏
  • 举报
回复
不会吧,貌似我的还没有正常过

我测了一下,win32 N=1000000

我这里有个warning,但还是运行了
Warning: cannot form a team with 4 threads, using 1 instead. Consider setting K
MP_ALL_THREADS to a number larger than 32.

win32下的编译参数我没有做过太多的调整,或许有不正确地方

还有,我的ICC是最新版本的(10.1.020),如果在低版本的ICC编译需要调整一下参数。特别是c/c++->optimization中的指令集
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
那时候很多地方还没有用展开处理
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
我的程序在linux+EON5120跑出来的

单线程 6.146269 seconds
多线程 2.170675 seconds
parallel_sort: 1.830920 seconds

线程化做得不够好
4个核 1:3

这个可是真实成绩啊
zm0011 2008-04-26
  • 打赏
  • 举报
回复
小邓,你使诈啊,前天你发帖说排序2^25时间需要10秒,还不包括IO,可在我的机器上你的程序排序5千万整数包括IO时间才4秒多一点,排序时间1秒左右......俺被骗了,被骗了,5555555555

haojin的程序我还没编译成功,暂时没法运行
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
32位下我编译了你们的程序
100万个数据的测试 haojn的程序报异常 zm的程序是错误的结果[BCD必须要64bit]
haojn 2008-04-26
  • 打赏
  • 举报
回复
我的程序在win32-release下也是可以编译的,不过N要小一点,2^25应该没问题。N大了的话,输出的时候会出现内存不够mapview,排序部分还是能运行的

merge函数如果用asm改写一下,应该会更快一点。我把时间都用在优化I/O上了
zm0011 2008-04-26
  • 打赏
  • 举报
回复
链表确实效率不高。不过在64bit机器上,8字节的BCD码就是一个整数,而且我认为对绝大多数程序来说,64bit机器基本上不考虑内存容量的问题
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
zm 其实你的优化做得很好
一如优美图 我也是优化做得不错 但是算法上使用了填充点的值 而你使用了边
我的搜索空间要大很多

这次BCD码其实需要更多的内存 至少这个就是缺点 还有链表在简单数据排序时基本上应该没有优势.

另外我没有办法运行你和haojn的程序 因为我没有64位的机器 :(
haojn 2008-04-26
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 zm0011 的回复:]
我用的测试数据取值范围不足,导致有个BUG没被发现。一个常量值错了,正确的定义是:

#define MAX_RANGES ((0xA429496729500000 >> RANGE_DIV) + 1)

不过,如果评委使用的测试数据中没有超过999999999的整数,那么我的程序在竞赛规则范围内还是“正确”哈。

唉,实不相瞒,最近我家里出事了......
[/Quote]
深刻同情中...
zm0011 2008-04-26
  • 打赏
  • 举报
回复
这一次,我的程序效率很糟糕......惨不忍睹啊
haojn 2008-04-26
  • 打赏
  • 举报
回复
我是按\r分的,只能在Windows下用。其实我想过输出的时候只用'\n',这样可以少输出一点,但是怕评委用二进制比较就没用。


其实这个比赛偶然性挺大的
比如第一次,denghui0815的比我好很多,但是因为评委没有测大数据。而我的程序设定了很多策略来平衡结果和时间,于是占了便宜

我还是喜欢以“执行时间”为唯一标准的比赛


我现在期待intel能把奖品改成penryn核心的
denghui0815 2008-04-26
  • 打赏
  • 举报
回复
哎,表示同情!
zm0011 2008-04-26
  • 打赏
  • 举报
回复
我用的测试数据取值范围不足,导致有个BUG没被发现。一个常量值错了,正确的定义是:

#define MAX_RANGES ((0xA429496729500000 >> RANGE_DIV) + 1)

不过,如果评委使用的测试数据中没有超过999999999的整数,那么我的程序在竞赛规则范围内还是“正确”哈。

唉,实不相瞒,最近我家里出事了......
加载更多回复(19)

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧