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