个人发明的代数排序法,比快排快。

// 排序.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

结果一致


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值