编程珠玑1.3

输入文件为包含1 000 000个不重复整数,整数范围为0-10 000 000.

比较系统快速排序和位排序的速度。

注:这里为了模拟输入文件的时间,sort()快速排序把a数组复制给bb数组。

可以看出,位排序 速度是 快速排序 的两倍。

 

#include <iostream>
#include <fstream>
#include <algorithm>
#include <time.h>
using namespace std;
#define N 10000000
#define S 1000000
#define bt 350000
#define SIZE (sizeof(int)*8)
int a[S];
int f[N];
 int bb[S];
int bit[bt];
void build(){
    memset(a,0,sizeof(a));
    memset(f,0,sizeof(f));
    for(int i=0;i<S;i++){
        int temp=0;
        while(1){
            temp=rand()%N;
            if(f[temp]==0){
                a[i]=temp;
                f[temp]=1;
                break;
            }
        }
    }
}
void sort(int *a,int n){
    for(int i=0;i<S;i++)bb[i]=a[i];
    sort(bb,bb+n);
}
void sortBit(int *a,int n){
    memset(f, sizeof(f), 0);
    memset(bit,sizeof(bit),0);
    for(int i=0;i<n;i++){
        int x = a[i]/SIZE;
        int y = a[i]%SIZE;
        bit[x]=bit[x]|(1<<y);
    }
    for(int i=0,j=0;i<bt;i++){
        for(int k=0;k<SIZE;k++){
            if((bit[i]&(1<<k))==1){
                a[j++]=bit[i]*SIZE+k;
            }
        }
    }
}
int main(){
    int b[S],c[S];
    clock_t start,end;
    build();
    for(int i=0;i<S;i++){
        b[i]=a[i];
        c[i]=a[i];
    }
    start=clock();
    sort(b,S);
    end=clock();
    cout<<(end-start)*1.0/CLOCKS_PER_SEC<<endl;
    start=clock();
    sortBit(c, S);
    end=clock();
    cout<<(end-start)*1.0/CLOCKS_PER_SEC<<endl;
    
    return 0;
}

运行结果为:

0.078051

0.038832

你可能感兴趣的:(编程珠玑)