编程珠玑之第一章习题3:度量100w整数排序的运行时间
来源:互联网 发布:flash编程代码大全 编辑:程序博客网 时间:2024/05/16 06:41
首先利用“编程珠玑之习题1.4: 生成不同的随机顺序的随机整数及存储与读取”给出的生成随机数的方法,在1000w整数的范围内生成100w个随机数;这里生成的随机数文件是unsortfile.txt文件,排序后的文件是sortedfile.txt
1.C++STL(vector, sort)进行排序:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 测试C++库的sort结合vector给100w整数排序耗时情况
#include <iostream>
#include <fstream>
#include <ctime> /* time */
#include <algorithm>
#include <vector>
#define Error( str ) FatalError( str )
#define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
#define N 10000000
using namespace std;
int main ()
{
vector<int> vec;
ifstream infile;
infile.open("unsortfile.txt");
if (!infile)
FatalError("不能打开unsortfile.txt文件!\n");
// 从文件中读取数据
clock_t starTtime = clock();// 开始时间
int index = 0, nValue = 0;
infile >> nValue;
//while(infile.peek() != EOF) // 不变式:此时已经得到index个数
while(!infile.eof()) // peek()和efo()都工作
{
index++;
vec.push_back(nValue);
infile >> nValue;
}
infile.close();
clock_t endTimeRead = clock();
sort(vec.begin(), vec.end());
clock_t endTimeSort = clock();
ofstream outfile;
outfile.open("sortedfile.txt");
if (!outfile)
FatalError("不能打开sortedfile.txt文件!\n");
for (int i=0; i != vec.size(); ++i)
{
outfile << vec[i] << "\t";
}
outfile.close();
clock_t endTimeWrite = clock(); // 结束时间
float readTime = (float)(endTimeRead - starTtime) / CLOCKS_PER_SEC; // secs
float sortTime = (float)(endTimeSort- endTimeRead) / CLOCKS_PER_SEC;
float writeTime = (float)(endTimeWrite- endTimeSort) / CLOCKS_PER_SEC;
cout << "文件中的记录数:" << vec.size() << endl;
cout << "读文件耗时:" << readTime << endl;
cout << "文件排序耗时:" << sortTime << endl;
cout << "写文件耗时:" << writeTime << endl;
return 0;
}
#include <iostream>
#include <fstream>
#include <ctime> /* time */
#include <algorithm>
#include <vector>
#define Error( str ) FatalError( str )
#define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
#define N 10000000
using namespace std;
int main ()
{
vector<int> vec;
ifstream infile;
infile.open("unsortfile.txt");
if (!infile)
FatalError("不能打开unsortfile.txt文件!\n");
// 从文件中读取数据
clock_t starTtime = clock();// 开始时间
int index = 0, nValue = 0;
infile >> nValue;
//while(infile.peek() != EOF) // 不变式:此时已经得到index个数
while(!infile.eof()) // peek()和efo()都工作
{
index++;
vec.push_back(nValue);
infile >> nValue;
}
infile.close();
clock_t endTimeRead = clock();
sort(vec.begin(), vec.end());
clock_t endTimeSort = clock();
ofstream outfile;
outfile.open("sortedfile.txt");
if (!outfile)
FatalError("不能打开sortedfile.txt文件!\n");
for (int i=0; i != vec.size(); ++i)
{
outfile << vec[i] << "\t";
}
outfile.close();
clock_t endTimeWrite = clock(); // 结束时间
float readTime = (float)(endTimeRead - starTtime) / CLOCKS_PER_SEC; // secs
float sortTime = (float)(endTimeSort- endTimeRead) / CLOCKS_PER_SEC;
float writeTime = (float)(endTimeWrite- endTimeSort) / CLOCKS_PER_SEC;
cout << "文件中的记录数:" << vec.size() << endl;
cout << "读文件耗时:" << readTime << endl;
cout << "文件排序耗时:" << sortTime << endl;
cout << "写文件耗时:" << writeTime << endl;
return 0;
}
2. C库函数qsort给100W排序:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//测试C库的qSort给100w整数排序耗时情况
#include <stdio.h>
#include <stdlib.h> /* qsort */
#include <time.h> /* time, clock_t*/
#include <assert.h> /* assert */
#include <string.h> /* memset*/
#define Error( str ) FatalError( str )
#define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
#define N 10000000
int intcomp (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main()
{
int arr[N];
memset(arr, 0, sizeof(arr));// 数组a清零
FILE* iofile;
if ( NULL == (iofile = fopen("unsortfile.txt", "r")) )
FatalError("不能打开unsortfile.txt文件!\n");
// 从文件中读取数据
clock_t starTtime = clock();// 开始时间
int index = 0;
while(fscanf(iofile, "%d", &arr[index]) != EOF)
{
index++;
}
fclose(iofile);
clock_t endTimeRead = clock();
qsort(arr, index, sizeof(int), intcomp);
clock_t endTimeSort = clock();
if ( NULL == (iofile = fopen("sortedfile.txt", "w")) )
FatalError("不能打开sortedfile.txt文件!\n");
for (int i = 0; i < index; i++)
{
fprintf(iofile, "%d\t", arr[index]);
}
fclose(iofile);
clock_t endTimeWrite = clock(); // 结束时间
float readTime = (float)(endTimeRead - starTtime) / CLOCKS_PER_SEC; // secs
float sortTime = (float)(endTimeSort- endTimeRead) / CLOCKS_PER_SEC;
float writeTime = (float)(endTimeWrite- endTimeSort) / CLOCKS_PER_SEC;
printf("文件中的记录数:%d\n", index);
printf("读文件耗时: %5.3f秒\n", readTime);
printf("文件排序耗时:%5.3f秒\n", sortTime);
printf("写文件耗时: %5.3f秒\n", writeTime);
return 0;
}
#include <stdio.h>
#include <stdlib.h> /* qsort */
#include <time.h> /* time, clock_t*/
#include <assert.h> /* assert */
#include <string.h> /* memset*/
#define Error( str ) FatalError( str )
#define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
#define N 10000000
int intcomp (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main()
{
int arr[N];
memset(arr, 0, sizeof(arr));// 数组a清零
FILE* iofile;
if ( NULL == (iofile = fopen("unsortfile.txt", "r")) )
FatalError("不能打开unsortfile.txt文件!\n");
// 从文件中读取数据
clock_t starTtime = clock();// 开始时间
int index = 0;
while(fscanf(iofile, "%d", &arr[index]) != EOF)
{
index++;
}
fclose(iofile);
clock_t endTimeRead = clock();
qsort(arr, index, sizeof(int), intcomp);
clock_t endTimeSort = clock();
if ( NULL == (iofile = fopen("sortedfile.txt", "w")) )
FatalError("不能打开sortedfile.txt文件!\n");
for (int i = 0; i < index; i++)
{
fprintf(iofile, "%d\t", arr[index]);
}
fclose(iofile);
clock_t endTimeWrite = clock(); // 结束时间
float readTime = (float)(endTimeRead - starTtime) / CLOCKS_PER_SEC; // secs
float sortTime = (float)(endTimeSort- endTimeRead) / CLOCKS_PER_SEC;
float writeTime = (float)(endTimeWrite- endTimeSort) / CLOCKS_PER_SEC;
printf("文件中的记录数:%d\n", index);
printf("读文件耗时: %5.3f秒\n", readTime);
printf("文件排序耗时:%5.3f秒\n", sortTime);
printf("写文件耗时: %5.3f秒\n", writeTime);
return 0;
}
3. 利用位图排序情况:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time, clock_t*/
#include <assert.h> /* assert */
#include <string.h> /* memset*/
#define Error( str ) FatalError( str )
#define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];
void set(int i)
{
a[i>>SHIFT] |= (1<<(i & MASK));
return;
}
void clr(int i) // 初始化清零
{
a[i>>SHIFT] &= ~(1<<(i & MASK)); // 逐次将32为值清零
}
int test(int i) // 测试逻辑位置为n的二进制位是否为1
{
return a[i>>SHIFT] & (1<<(i & MASK));
}
int main()
{
FILE* iofile;
for (int i = 0; i < N; i++)
clr(i);
//Replace above 2 lines with below 3 for word-parallel init
// int top = 1 + N/BITSPERWORD;
// for (i = 0; i < top; i++)
// a[i] = 0;
if ( NULL == (iofile = fopen("unsortfile.txt", "r")) )
FatalError("不能打开unsortfile.txt文件!\n");
clock_t starttime = clock();// 开始时间
// 从文件中读取数据
int index = 0, nValue;
while(fscanf(iofile, "%d", &nValue) != EOF)
{
set(nValue);
index++;
}
fclose(iofile);
clock_t endtime1 = clock();
if ( NULL == (iofile = fopen("sortedfile.txt", "w")) )
FatalError("不能打开unsortfile.txt文件!\n");
for (int i = 0; i < N; i++)
{
if (test(i))
fprintf(iofile, "%d\t", i);
}
fclose(iofile);
clock_t endtime2 = clock(); // 结束时间
float costTime1 = (float)(endtime1 - starttime) / CLOCKS_PER_SEC; // secs
float costTime2 = (float)(endtime2 - endtime1) / CLOCKS_PER_SEC;
printf("文件中的记录数:%d\n", index);
printf("读文件耗时:%5.3f秒\n", costTime1);
printf("写文件耗时:%5.3f秒\n", costTime2);
return 0;
}
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time, clock_t*/
#include <assert.h> /* assert */
#include <string.h> /* memset*/
#define Error( str ) FatalError( str )
#define FatalError( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];
void set(int i)
{
a[i>>SHIFT] |= (1<<(i & MASK));
return;
}
void clr(int i) // 初始化清零
{
a[i>>SHIFT] &= ~(1<<(i & MASK)); // 逐次将32为值清零
}
int test(int i) // 测试逻辑位置为n的二进制位是否为1
{
return a[i>>SHIFT] & (1<<(i & MASK));
}
int main()
{
FILE* iofile;
for (int i = 0; i < N; i++)
clr(i);
//Replace above 2 lines with below 3 for word-parallel init
// int top = 1 + N/BITSPERWORD;
// for (i = 0; i < top; i++)
// a[i] = 0;
if ( NULL == (iofile = fopen("unsortfile.txt", "r")) )
FatalError("不能打开unsortfile.txt文件!\n");
clock_t starttime = clock();// 开始时间
// 从文件中读取数据
int index = 0, nValue;
while(fscanf(iofile, "%d", &nValue) != EOF)
{
set(nValue);
index++;
}
fclose(iofile);
clock_t endtime1 = clock();
if ( NULL == (iofile = fopen("sortedfile.txt", "w")) )
FatalError("不能打开unsortfile.txt文件!\n");
for (int i = 0; i < N; i++)
{
if (test(i))
fprintf(iofile, "%d\t", i);
}
fclose(iofile);
clock_t endtime2 = clock(); // 结束时间
float costTime1 = (float)(endtime1 - starttime) / CLOCKS_PER_SEC; // secs
float costTime2 = (float)(endtime2 - endtime1) / CLOCKS_PER_SEC;
printf("文件中的记录数:%d\n", index);
printf("读文件耗时:%5.3f秒\n", costTime1);
printf("写文件耗时:%5.3f秒\n", costTime2);
return 0;
}
从以上来看,利用vector来排序效果最差,其实我们可以再试一下list和set对这100w数据的排序,效果应该会优于vector,以后有时间再测!!!
- 编程珠玑之第一章习题3:度量100w整数排序的运行时间
- 编程珠玑之第一章习题6给每个整数不超过10次的100w数据排序的测试用例
- 编程珠玑之第一章习题5:两趟算法完成100w数据排序
- 编程珠玑之第一章习题5:k趟算法给1000w数据排序的测试用例
- 编程珠玑第一章习题
- 编程珠玑之第一章习题4: 生成不同的随机顺序的随机整数及存储与读取
- 编程珠玑之第一章:开篇(习题)泛览
- 编程珠玑之第一章习题8:包含区号800、877,888情况下的排序测试用例
- 编程珠玑 第一章 习题9
- 编程珠玑 第一章习题1
- 编程珠玑 第一章习题解答
- 编程珠玑 第一章 习题解答
- 编程珠玑 第一章习题解答
- 编程珠玑第一章习题9
- 编程珠玑第一章课后习题
- 编程珠玑第一章习题解答
- 编程珠玑(开篇)--第一章习题
- 编程珠玑第一章 习题2,习题9
- 6.等待,只因曾经承诺
- 改善C++ 程序的150个建议学习之建议34:用智能指针管理通过new创建的对象
- 设置Ubuntu上的MySQL可以远程访问
- 触发Full GC执行的情况
- 7.最熟悉的陌生人--probe
- 编程珠玑之第一章习题3:度量100w整数排序的运行时间
- HTML文件能不能用GZIP压缩
- VS2010 编译出错 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 如何治疗失眠
- 由于Full GC频繁造成服务器频繁重新启动
- CSS一---选择器
- 黑马程序员----集合框架
- 空值和NULL值在DB2中与ORACLE不同点
- json对象