#include <vld.h>
#include <queue>
#include <iostream>
#include <iomanip>
#include "_CRandom.h"
using namespace std ;
/*
* 描 述:在早期计算中,常用排序机来对一组穿孔卡片排序。即排序机上有十个箱子,把数放入,排序后拿出
* 假定卡片上的数为两位整数,范围为00~99。
* 排序机有十个箱子,编号0~9。排序机处理卡片两遍,第1遍处理个位数,第2遍处理十位数。
* 比如编号1里面放十位数为1的,编号2里放十位数为2的。然后取卡片通过排序机时掉入相应的箱子里。
* 这种方法称为基数排序。
* 步骤 :按个位分到箱子,拿出,按十位分到箱子,拿出,输出结果
* 摘 要:穿孔卡片派序
* 作 者:
* 完成日期:
*/
enum DigitKind{ones, tens};
void Collect(queue<int> digitQueue[], int L[]);
void Distribute(int L[], queue<int> digitQueue[], int n, DigitKind kind);
int main()
{
int i=0;
int L[50];
_CRandom _rand;
queue<int> digitQueue[10];
srand( (unsigned)time( NULL ) );
for(i=0; i<50; i++)
{
L[i]=_rand.getINT(100);
}
//打印随机数
cout<<"排序前: "<<endl;
for(i=0; i<50; i++)
{
cout<<setw(4)<<L[i];
if( (i+1)%10==0)
{
cout<<endl;
}
}
Distribute(L, digitQueue, 50, ones);
Collect(digitQueue, L);
Distribute(L, digitQueue, 50, tens);
Collect(digitQueue, L);
cout<<endl<<endl<<endl;
cout<<"排序后: "<<endl;
for(i=0; i<50; i++)
{
cout<<setw(4)<<L[i];
if( (i+1)%10==0)
{
cout<<endl;
}
}
return 0;
}
void Distribute(int L[], queue<int> digitQueue[], int n, DigitKind kind)
{
int i;
for(i = 0; i<n; i++)
{
//个位
if(kind == ones)
{
digitQueue[L[i] % 10].push(L[i]);
}
//十位
else
{
digitQueue[L[i]/10].push(L[i]);
}
}
}
void Collect(queue<int> digitQueue[], int L[])
{
int i=0, digit=0;
for(digit=0; digit<10; digit++)
{
while( !digitQueue[digit].empty())
{
L[i++] = digitQueue[digit].front();
digitQueue[digit].pop();
}
}
}
/*
排序前:
53 24 27 25 18 21 52 39 75 42
4 57 54 57 70 9 73 36 91 45
23 89 47 81 80 38 14 95 95 40
51 49 19 35 5 26 57 13 33 68
13 18 71 2 71 85 36 78 14 28
排序后:
2 4 5 9 13 13 14 14 18 18
19 21 23 24 25 26 27 28 33 35
36 36 38 39 40 42 45 47 49 51
52 53 54 57 57 57 68 70 71 71
73 75 78 80 81 85 89 91 95 95
Press any key to continue
*/
图法:
比如数
31,46,85,15,92,35,91,22
队列有10个,0~9,按个位放入数据
0 1 2 3 4 5 6 7 8 9
31 92 85 46
91 22 15
35
按队列读出得
31 91 92 22 85 15 35 46
按十位放入
0 1 2 3 4 5 6 7 8 9
15 22 31 46 85 91
35 92
读出
15 22 31 35 46 85 91 92
算法复杂度
复杂度为O(2N)。扩展到对m位的n个数排序,复杂度为O(mn).但是在空间上消耗很大,至少要10个队列。队列中需要有front,rear指针,计数器,数组,对内存管理等等。如果数据量和位数增大,mn所需要的性能更大,
还有个问题,比如遇上负数可能还要另外开个队列来进行维护等等。。。
分享到:
相关推荐
- **读取穿孔卡片**: 系统首先读取包含修改信息的穿孔卡片,并按记录号对修改信息进行排序。 - **读取主文件**: 接着,系统读取磁带上的主文件,根据记录上的校验码校核每个读入的记录,丢弃错误记录。 - **应用修改...
在给定的场景中,系统接收“卡片”作为输入,卡片上包含修改磁带主文件的信息。系统对这些信息进行处理,包括排序、校验、修改和创建新文件。最终,系统输出一份修改报告。因此,系统的IPO图可以简化为: 输入: 1....
在计算机早期阶段,穿孔卡片是一种常用的数据存储方式。虽然现在已经被淘汰,但在理解早期计算机系统的工作原理时仍有一定的参考价值。 ### 总结 通过《算法导论》的学习,我们可以了解到不同类型的排序算法及其...
文件管理员通过穿孔卡片输入修改信息,系统则按照记录号对这些信息进行排序,然后读取主文件,校验每个记录,丢弃错误的记录,修改剩下的记录,并将新文件保存到磁盘,最后生成一份修改报告。 在这个过程中,我们...
在这个系统中,过程包括对卡片排序、校验记录、修改记录、写新文件以及打印修改报告。 3. 输出(Output):经过处理后生成的结果,用于提供给用户或系统其他部分使用。在这个系统中,输出是新文件、修改报告,以及...
12. **perforator**:穿孔机,早期计算机时代用于制作穿孔卡片的设备,用以存储数据。 13. **peripheral equipment**:外围设备,指连接到计算机的辅助设备,如打印机、鼠标、键盘等。 14. **personal computer ...
随着技术发展,数据存储技术经历了选数管、穿孔卡片、穿孔纸带、硬盘到激光磁盘等阶段,容量不断增大,成本降低,性能大幅提升。 综上所述,信息资源与组织管理是多学科交叉的领域,涵盖了信息编码、组织、检索、...
25. **punched card, punch card (穿孔卡片)**:早期数据存储介质,通过穿孔表示二进制数据。 26. **punched tape, punch tape (穿孔纸带)**:另一种早期的数据存储方式,通过穿孔在纸带上编码信息。 27. **punch ...
- **机械检索**:引入了穿孔卡片技术和光电技术来提高检索效率。 - **计算机检索**: - 定义:通过对大量文献资料进行处理并存储在磁盘上形成的机读数据库进行查询的方式。 - 构成:主要包括信息存储和信息检索两...
Herman Hollerith 使用穿孔卡来存储数据,并用一台制表机来进行统计和排序。他的公司后来跟别的公司进行了合并,并在 1924 年最终成为了国际商业机器公司,也就是 IBM。 机器代码 机器代码是电子学与计算机科学的...
34. **对话框重新排序**:重新组织了Line/Point、Surface、Element和Node对话框的布局,提高了操作效率。 35. **Model Check & Repair中增加Mesh Surface Deviation功能**:增加了Mesh Surface Deviation功能,可以...
文件结构的发展源于实际数据处理的需求,最早可以追溯到19世纪末Herman Hollerith的人口统计方法,他利用穿孔卡片进行数据存储和处理,这奠定了现代文件系统的基础。 文件的基本概念包括以下几个方面: 1. 记录...
- **穿孔卡片检索**:出现在20世纪50年代。 - **计算机检索**:20世纪60年代开始发展,主要面向主题检索。 - **联机检索**:20世纪70年代至80年代间兴起。 - **Web检索**:自20世纪90年代起,随着互联网的普及而快速...
2. 穿孔卡片检索(20世纪50年代) 3. 计算机检索(面向主题,20世纪60年代) 4. 联机检索(20世纪70年代至80年代) 5. Web检索(20世纪90年代) #### 基于分类的检索及其局限性 基于分类的检索方法利用分类体系将...
程序的每一行都有特定的格式,这些规则在早期是为了适应穿孔卡片作为输入媒介的时代需求。尽管如今的输入方式已大为改变,但这些规则依然保留,以确保代码的规范性和一致性。 COBOL程序的基本结构分为四个部分:...
早期的情报检索主要依靠人工完成,后来逐渐过渡到穿孔卡片检索(1950年代)、计算机检索(面向主题,1960年代)、联机检索(1970年代至1980年代),直至现在的Web检索(1990年代至今)。随着技术的进步,信息检索的...