// 排序.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#define _AFXDLL
#include <afx.h>
#include <vector>
#include <random>
#include <time.h>
#include <iostream>
using namespace std;
int total_c=0;
#define buf_length 30000000
int an[buf_length];
int bn[buf_length];
#define all_count 1000
struct data
{
int last;
int value;
};
struct buf
{
int lasts[all_count];
data d[buf_length];
int cc[all_count];
int all_c;
inline void reset(int val,int allc)
{
all_c=0;
for (int i=0;i<allc;i++)
{
cc[i]=-1;
lasts[i]=-1;
}
for (int i=0;i<val;i++)
{
d[i].last=0;
}
}
inline void push(int p,int value)
{
d[all_c].value=value;
if(cc[p]==0)
cc[p]=all_c;
else
{
d[all_c].last=cc[p];
cc[p]=all_c;
}
all_c++;
lasts[p]=cc[p];
}
};
buf buffer;
inline void sort(int* a,int start,int end)
{
int max=a[start];
int min=a[start];
for (int i=start;i<end;i++)
{
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
}
int all_c=all_count;
all_c=max-min+1<all_count?max-min+1:all_count;
int total=((max-min)+1)/all_c;
buffer.reset(end-start,all_c);
int* zm=new int[all_c];
for (int i=start;i<end;i++)
{
total_c++;
int z=((a[i]-min)/total);
z=z>all_c-1?all_c-1:z;
z=z<0?0:z;
buffer.push(z,a[i]);
}
int p=start;
for (int i=0;i<all_c;i++)
{
for (int j=buffer.lasts[i];j!=-1;j=buffer.d[j].last)
{
a[p]=buffer.d[j].value;
p++;
}
zm[i]=p;
}
for (int i=0;i<all_c;i++)
{
if(i==0)
{
if(zm[0]-start<end-start&&zm[0]-start>1)
sort(a,start,zm[0]);
}
else
{
if(zm[i]-zm[i-1]<end-start&&zm[i]-zm[i-1]>1)
sort(a,zm[i-1],zm[i]);
}
}
delete zm;
};
int total_b=0;
inline int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
int _tmain(int argc, _TCHAR* argv[])
{
srand(time(0));
int zz=buf_length;
cout<<"数据个数:"<<zz;
for (int i=0;i<zz;i++)
{
int randd=0;
for (int j=0;j<30;j++)
{
randd+=rand()%2?1<<j:0;
}
an[i]=(randd);
bn[i]=an[i];
// cout<<bn[i]<<" ";
}
cout<<endl;
double d1=GetTickCount();
qsort(bn,buf_length,sizeof(bn[0]),cmp);
double d2=GetTickCount();
sort(an,0,buf_length);
double d3=GetTickCount();
cout<<"QsTime:"<<d2-d1<<endl;
cout<<"Mytime:"<<d3-d2<<endl;
/*
cout<<endl;
for (int i=0;i<buf_length;i++)
{
cout<<an[i]<<" ";
}
cout<<endl;
for (int i=0;i<buf_length;i++)
{
cout<<bn[i]<<" ";
}*/
bool c=1;
for (int i=0;i<buf_length;i++)
{
c&=(an[i]==bn[i]);
}
cout<<endl<<(c?"结果一致":"结果不一致");
cout<<endl;
// cout<<"草祭排序法:"<<total_c<<"次"<<endl;
// cout<<"快速排序法"<<total_b<<"次"<<endl;
// cout<<"节约次数"<<total_b-total_c<<endl;
return 0;
}
以上是源码,比较c语言自带的快排函数。
下面是连续测试结果:
数据个数:30000000
QsTime:16162
Mytime:7098
结果一致
数据个数:3000000
QsTime:1685
Mytime:749
结果一致
数据个数:300000
QsTime:156
Mytime:109
结果一致
QsTime:16162
Mytime:7098
结果一致
数据个数:3000000
QsTime:1685
Mytime:749
结果一致
数据个数:300000
QsTime:156
Mytime:109
结果一致