输入:一个包含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[N];
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;
}
运行结果: