各种排序算法的效率比较

(1)本文包括冒泡算法、快排算法、插入排序算法等;通过随机数进行比较他们之前的效率;

(2)自己手动实现的简单的算法 冒泡和快排与系统自带的算法进行了比较,由于系统自带是面向容器的,所以总体上不如自己简单实现的效率高,但是基本上在一个数量级上;

(3)第一次这样纵向的比较自己手动写的代码,还是有点小激动的,不足之处,请各位指正哦。。

(4)我也幼稚我的哦。。。



/*
//use stl
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;

//use c qsort
#include <cstdlib>

//clock
#include <ctime>

struct mytype{
int key;
int data;
};

struct mygen{
//typedef 
mytype operator() (void) const {
mytype v;
v.key=rand();
return v;
}
};

struct stl_cmp:public binary_function<mytype,mytype,bool>{
bool operator() (const mytype& e1,const mytype& e2) const { return e1.key<e2.
key; }
};

static int qsort_cmp(const void* e1,const void* e2)
{
return (*(mytype*)e1).key-(*(mytype*)e2).key;
}

mytype a[10000000];


int main(int argc, char* argv[])
{
//stl sort
clock_t t;

generate(a, a+sizeof(a)/sizeof(a[0]), mygen());
t=clock();
sort(a,a+sizeof(a)/sizeof(a[0]),stl_cmp());
t=clock()-t;
cout<<"stl sort cost "<<t*1.0/CLK_TCK<<" seconds"<<endl;

//c qsort
generate(a, a+sizeof(a)/sizeof(a[0]), mygen());
t=clock();
qsort((void*)a,sizeof(a)/sizeof(a[0]),sizeof(a[0]),qsort_cmp);
t=clock()-t;
//cout<<"c qsort cost "<<t*1.0/CLK_TCK<<" seconds"<<endl;
cout<<"c qsort cost "<<(double)t/CLOCKS_PER_SEC<<" seconds"<<endl;


return 0;
} // c语言中的qsort() 和 c++中的sort()的比较,比较正规的源代码。
*/
/*
clock()函数计算出来的是硬件滴答的数目,不是毫秒。在TC2.0中硬件每18.2个滴答是一秒,
在VC++6.0中硬件每1000个滴答是一秒。
typedef long clock_t;
#define CLK_TCK 18.2
在VC++6.0中类似的有CLOCKS_PER_SEC 。其值为1000。
#define CLOCKS_PER_SEC 1000
因此VC6.0中CLK_TCK的值不再是18.2,而是1000。
  */

#include <iostream>
#include <ctime>
#include <cstdlib> //rand()
#include <algorithm> //sort()

using namespace std;

const int N = 100000;
struct data{
	int key;
	int num;
};
struct data a[N],b[N],c[N],d[N];

//bool quick_cmp(const void *a, const void *b)  //bool型报错
int quick_cmp(const void *a, const void *b)
{
	//if( (*(data*)a).key > (*(data*)b).key)
	//	return true;
//	return false;
	return (*(data*)a).key - (*(data*)b).key;
}//不可以用于sort 的,因为sort()的原函数决定的。而qsort()的cmp就必须是这个形式。
bool stl_cmp(const data &a, const data &b)
{
	if( a.key > b.key)
		return true;
	return false;
}//可以了。

void BubSort(data a[],int n)
{
	int flag,i,j;
	int temp;
	for (i=0;i<n;i++)//从小到大
	{
		flag = 0;
		for (j=n-1;j>i;j--)
		{
			if (a[j].key<a[j-1].key)
			{
				temp = a[j].key;
				a[j].key = a[j-1].key;
				a[j-1].key = temp;
				flag = 1;
			}
		}
		if (flag == 0)
			break;
	}
}

int quicksort(data b[], int left, int right)//从小到大
{
	if(left < right)
	{
		int key = b[left].key;
		int low = left;
		int high = right;
		while(low < high)
		{
			while(low < high && b[high].key >= key)
			{
				high--;
			}
			b[low].key = b[high].key;//若是没有找到比key 小的(即由于low = high 而退出循环),
			//则这句话的意思是把自己赋值给自己。

			while(low < high && b[low].key <= key)
			{
				low++;
			}
			b[high].key = b[low].key;//若是没有找到比key 大的(即由于low = high 而退出循环),
			//则这句话的意思……(分情况:当上面的找到比key小的了,则移动;当上面也没有找到,则自己赋值给自己)。
		}

		b[low].key = key;
		quicksort(b,left,low-1);
		quicksort(b,high+1,right);
	}
	return 0;
}


int main()
{
	int i;
	clock_t t_start,t_end;

	for (i=0;i<N;i++)
	{
		a[i].key = rand();
		b[i].key = a[i].key;
		c[i].key = a[i].key;
		d[i].key = a[i].key;
		//cout << a[i].key<<" ";
	}
	t_start = clock();
	BubSort(a,N);
	t_end = clock();
	cout << "对于数据量为" << N << "的自己写的冒泡算法所用时间为:" << (double)(t_end - t_start)/CLOCKS_PER_SEC << "秒" << endl; 
	//for ( i=0;i<N;i++)
	//	cout << a[i].key << " ";
	cout << endl << endl;
	
	t_start = clock();
	//sort(c,c+sizeof(c)/sizeof(c[0]),cmp);
	sort(c,c+N,stl_cmp);
	t_end = clock();
	cout << "对于数据量为" << N << "的系统自带的stl::sort()算法的快排算法所用时间为:" << (double)(t_end - t_start)/CLOCKS_PER_SEC << "秒" << endl; 


	t_start = clock();
	quicksort(b,0,N-1);//这得是N-1,最后一个数的下标。
	t_end = clock();
	cout << "对于数据量为" << N << "的自己写的快排算法所用时间为:" << (double)(t_end - t_start)/CLOCKS_PER_SEC << "秒" << endl; 
	//for ( i=0;i<N;i++)
	//	cout << b[i].key << " ";

	t_start = clock();
	qsort(d,N,sizeof(d[0]),quick_cmp);
	t_end = clock();
	cout << "对于数据量为" << N << "的系统自带的c语言qsort()算法的快排算法所用时间为:" << (double)(t_end - t_start)/CLOCKS_PER_SEC << "秒" << endl; 
	cout << endl << "successfully"<<endl;
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值