2009 英特尔® 线程挑战赛 第一题 基数排序,有兴趣的来呀!

denghui0815 2009-04-12 11:14:40
加精
基数排序


问题描述:给出一组含有关键字的未排序字符串,这些关键字可视为整数的二进制表示,关键字内的各个位可以用来对这组字符串进行排序。这种排序方法被称为基数排序。

请编写一个用多线程实现基数排序算法的程序:对从输入文件读取的关键字进行排序,然后将排序后的关键字输出到另一个文件。输入文件名和输出文件名应为执行程序命令行的第一和第二个参数。

输入文件中的第一行是要排序的关键字总个数 (N);后面紧跟 N 个关键字,每行一个;关键字是由 7 个可打印字符组成的字符串,不含空格 (ASCII 0x20)。文件中关键字的个数小于 2^31 – 1。排序后的输出结果必须保存在文本文件中,每行一个关键字;

计时:如果您在程序中加入计时代码来计算排序过程所用的时间并报告已用的时间,将用这个时间来计分;如果不加入计时代码,将使用整个执行时间(包括输入时间和输出时间)来计分。


输入文件样例:
8
H@skell
surVEYs
sysTEMS
HASKELL
Surveys
1234567
SURveys
systEMS

输出文件样例:
1234567
H@skell
HASKELL
SURveys
Surveys
surVEYs
sysTEMS
systEMS


...全文
2154 94 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
94 条回复
切换为时间正序
请发表友善的回复…
发表回复
denghui0815 2009-04-26
  • 打赏
  • 举报
回复
文章已经发布
http://blog.csdn.net/denghui0815
laisiwei 2009-04-25
  • 打赏
  • 举报
回复
我也很想了解一下楼主的思路
luna1008 2009-04-24
  • 打赏
  • 举报
回复
LZ写了播客别忘了到这说说地址呀!
denghui0815 2009-04-23
  • 打赏
  • 举报
回复
恩 我周日发博客 呵呵
haojn 2009-04-23
  • 打赏
  • 举报
回复
确认一下,是北京时间周六下午3点前交,对吧?
denghui0815 2009-04-22
  • 打赏
  • 举报
回复
恩 马上就24号了 我会公开文档和代码
laisiwei 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 denghui0815 的回复:]

C/C++ code
void XCreateData(const char* szFile, uint32 nData)
{
FILE* fp = fopen(szFile, "wb");
char szData[10];
char pPrintChar[256];
int nPrintChar = 0;

if(fp != NULL)
{
fprintf(fp, "%d\n", nData);

sz…
[/Quote]

srand(0)
用这个生成5000万数据

排序时间:2532ms.

2.2G的四核

denghui 方便发一个exe测试一下吗
或者我编译一个用在双核电脑上的也行
laisiwei 2009-04-22
  • 打赏
  • 举报
回复
能不能发一下exe呢,在同一台电脑上测试方便一些
cui003 2009-04-21
  • 打赏
  • 举报
回复
受教了 楼主强人...
JaneThink 2009-04-21
  • 打赏
  • 举报
回复
我的想法是分块,再用基数排序,比如:将要排序的文件分为四部分,对每一部分用基数排序,四部分并行进行。在四部分都排好序后,再将四个部分两两合并起来。关键还是线程的同步问题,两两合并之前,必须保证两部分都用基数排序排好了。不知道这么想对不对。另外,将各个部分合并起来可能有更好的算法。
haojn 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 83 楼 haisujiang 的回复:]
我的想法是分块,再用基数排序,比如:将要排序的文件分为四部分,对每一部分用基数排序,四部分并行进行。在四部分都排好序后,再将四个部分两两合并起来。关键还是线程的同步问题,两两合并之前,必须保证两部分都用基数排序排好了。不知道这么想对不对。另外,将各个部分合并起来可能有更好的算法。
[/Quote]
clay说只允许基数排序,不能用归并
rxw137384765 2009-04-20
  • 打赏
  • 举报
回复
学习了
lixianyu 2009-04-20
  • 打赏
  • 举报
回复
嗨,DengHui,对于串行的基数排序,你是怎么变为并行的?能不能给点儿提示呀?
denghui0815 2009-04-20
  • 打赏
  • 举报
回复
Clay 已经说了2^32-1个字符串 是上限 实际测试估计文件大小不会超过2G的
q123456111222 2009-04-20
  • 打赏
  • 举报
回复
kjbkbkj
brucele 2009-04-20
  • 打赏
  • 举报
回复
我不是很明白,来学习了。
china25qd 2009-04-20
  • 打赏
  • 举报
回复
我觉得吧,7个字符就不要分了。
2^32-1个字符串读的时候可以用缓存分一分,正好在基数排序外面罩一层优分法,拆成几个线程来排,排完了再插。
嗯嗯,这是我目前想的出的最有效的办法了。
JaneThink 2009-04-20
  • 打赏
  • 举报
回复
仔细想了想,发现数据的大小就有7,8G(最多2^32-1个字符串),内部排序不行了,外部排序不知道怎么办~~~
sunny0104xie 2009-04-20
  • 打赏
  • 举报
回复
忙里偷闲,关注中
文子 2009-04-20
  • 打赏
  • 举报
回复
高手啊!
加载更多回复(70)

567

社区成员

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

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