«

[编程珠玑]第一章电话号码排序

输入:一个包含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;
}

运行结果:

分享