【编程珠玑】第一章电话号码排序
2013-05-15 16:38
357 查看
输入:一个包含100万个正整数的文件,每个数都小于1000万。如果在输入文件中有任何整数重复出现就是致命错误,没有其他数据与该整数相关联。
输出:按升序排列的输入整数的列表。
运行结果:
输出:按升序排列的输入整数的列表。
#include <iostream> #include <set> #include <ctime> #include <stdlib.h> using namespace std; int randInt(int start, int end) { srand(time(0)); int r = RAND_MAX*rand() + rand(); return start + r%(end-start+1); } // 1.利用 C/qsort int compare(const void *x, const void *y) { return *(int*)x-*(int*)y; } void qSort(int a[], int n) { int i; qsort(a, n, sizeof(int), compare); for (i=0; i<n; i++) ; //cout<<a[i]<<endl; } // 2.利用 C++/STL/set void stlSort(int a[], int n) { set<int> S; int i; set<int>::iterator j; for (i=0; i<n; i++) S.insert(a[i]); for (j=S.begin(); j!=S.end(); j++) ; //cout<<*j<<endl; } // 3.位图法 #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 // a / n = a >> n (if a>0) // a % n = a & (n-1) int b[1+N/BITSPERWORD]; void setBit(int i) { b[i>>SHIFT] |= (1<<(i & MASK)); } void clrBit(int i) { b[i>>SHIFT] &= ~(1<<(i & MASK)); } int testBit(int i) { return b[i>>SHIFT] & (1<<(i & MASK)); } void bitSort(int a[], int n) { int i; for (i=0; i<N; i++) clrBit(i); for (i=0; i<n; i++) setBit(a[i]); for (i=0; i<N; i++) if (testBit(i)) ; //cout<<i<<endl; } // 测试主程序 int main() { int i; int k = 1000000; int *a = new int ; time_t start, end; // 随机生成100万个不同的整数 start = clock(); for (i=0; i<N; i++) a[i] = i; for (i=0; i<k; i++) swap(a[i], a[randInt(i, N-1)]); end = clock(); cout<<"create data : "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl; start = clock(); bitSort(a, k); end = clock(); cout<<"bitSort : "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl; start = clock(); stlSort(a, k); end = clock(); cout<<"STL set sort : "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl; start = clock(); qSort(a, k); end = clock(); cout<<"use qsort sort: "<<(end-start)/(double)CLOCKS_PER_SEC<<" s"<<endl; delete []a; return 0; }
运行结果:
相关文章推荐
- 编程珠玑之第一章习题3:度量100w整数排序的运行时间
- 编程珠玑之第一章习题5:k趟算法给1000w数据排序的测试用例
- 对一千万条数据进行排序---编程珠玑第二版 第一章
- 对一千万条数据进行排序---编程珠玑第二版 第一章
- 编程珠玑之第一章习题6给每个整数不超过10次的100w数据排序的测试用例
- 【编程珠玑】第一章位图排序
- 编程珠玑:位图排序海量整数
- 编程珠玑开篇2--磁盘文件排序问题再讨论
- 【编程珠玑】第一章 开篇
- 【编程珠玑】第一章 开篇
- 转-编程珠玑第一章习题9
- [编程珠玑]-第一章:位图/位向量排序
- 编程珠玑第十一章----排序
- 【编程珠玑】排序与位向量
- 编程珠玑开篇--磁盘文件排序问题
- 编程珠玑----快速排序的变形
- 编程珠玑第一章
- 【编程珠玑】第一章:开篇
- 【编程珠玑】第十四章 堆(排序,优先级队列)
- 编程珠玑---第一章 阅读笔记