堆排序与快速排序效率比较

快排的平均效率是NlogN,堆排也是。但是快排会退化,而推排似乎最坏情况下也是NlogN。所以想比较比较

 

快排我没有自己写,而是用了qsort()函数。堆排我是自己写的,优化过一次,也只是把36s降到30s

 

测试数据是随即生产的,规模在10000000(一千万)。一共十组,共二十个输入输出文件,总大小为1.05G

 

现在发代码了... 先是快排的:

 

#include #include using namespace std; const int _DEF_SIZE = 10000000; //1000w int _gNum[_DEF_SIZE]; int _fcomp( const void *a,const void *b ) { return *((int*)a) - *((int*)b); //从小到大 } int main() { ifstream in("sort.in"); int size; in >> size; for( int i = 0;i < size;++i ) in >> _gNum[i]; qsort( _gNum,size,sizeof(int),_fcomp ); in.close(); ofstream out("sort.out"); for( int i = 0;i < size;++i ) out << _gNum[i] << ' '; out.close(); return 0; } 

 

接着是堆排序的,原来我写成类了,结果在优化的时候想是不是函数调用和其他的冗余操作拖慢了时间,所以直接写在里面了:

 

#include #include using namespace std; const int _DEF_SIZE = 10000010; //1000w int heap[_DEF_SIZE]; int hcount; int main() { ifstream in("sort.in"); int size; hcount = 0; in >> size; int p,j,cvST; for( int i = 0;i < size;++i ) { in >> heap[++hcount]; p = hcount,j = p/2; while( p != 1 ) { if( heap[j] > heap[p] ) { cvST = heap[j]; heap[j] = heap[p]; heap[p] = cvST; } else break; p = j; j = j >> 1; } } in.close(); ofstream out("sort.out"); for( int i = 0;i < size;++i ) { cvST = heap[1]; heap[1] = heap[hcount]; heap[hcount] = cvST; --hcount; int p = 1,j = p*2; while( j <= hcount ) { if( j < hcount && heap[j+1] < heap[j] ) ++j; if( heap[j] < heap[p] ) { cvST = heap[j]; heap[j] = heap[p]; heap[p] = cvST; } else break; p = j; j = j << 1; } out << heap[hcount+1] << ' '; } out.close(); return 0; }  

 

用数据说话。看评测结果了,快速排序的成绩

 

 

下面是堆排序的

 

 

堆排序用的时间大约是快排的两倍,函数库里的代码写的比我好也是一个影响因素吧。

你可能感兴趣的:(其他算法)