(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;
}