性能统计结果:
(基于如下随机生成方式)
希尔 VS qsort!!!
M=10时,交换比较次数都为14 vs 34;
M=100时,交换比较次数都为531 vs 791;
M=1000时,交换比较次数都为9314 vs 11957;
M=10000时,交换比较次数都为171081 vs 150776;
M=100000时,交换比较次数都为3096420 vs 1791888;
M=1000000时,堆栈溢出 vs 堆栈溢出 ...额~~~~~~~~;不分胜负...
也可能是测试数据原因,所以仅供参考...看来希尔排序还是挺快的哈有点O(N*(log方(平方不好打,不费事了)n))的意思
规模10000算是个分界点吧,之前的希尔强点,之后的快排快,不过还算在一个数量级上...汗~~~~~
----2010-1-22--
希尔程序源码:
- #include<stdio.h>
- #include<stdlib.h>
- #define M 100000
- static int xchg=1;
- static int cmp=1;
- void main(){
- int src[M],lop,l1,l2,l3;
- register int cmps;
- for(lop=0;lop<M;lop++)
- src[lop]=rand()%1000000;
- for(l1=1;l1<M/9;l1=l1*3+1);
- for(;l1>0;l1/=3)
- for(l2=l1-1;l2<M;l2++)
- {
- l3=l2;
- cmps=src[l3];
- while(l3>l1-1&&cmps<src[l3-l1]&&xchg++)
- {
- cmp++;
- src[l3]=src[l3-l1];l3-=l1;
- }
- src[l3]=cmps;
- }
- }
快排程序源码:
- #include<stdio.h>
- #include<stdlib.h>
- #define M 1000000
- static int cmpr=0;
- int intcmp(const void *a,const void *b){
- cmpr++;
- int *x,*y;
- x=(int*)a;
- y=(int*)b;
- if(*x>*y)
- {
- return 1;
- }
- else if(*x==*y)
- {
- return 0;
- }
- else
- return -1;
- }
- void main(){
- int x[M],lop,t1,t2;
- register int cmps;
- for(lop=0;lop<M;lop++)
- x[lop]=rand()%10000;
- qsort(x,M,sizeof(x[0]),intcmp);
- }