希尔排序,速度相当快

//程序中缺少的结构、函数请在上一篇博客里查找
 
#define MAXSIZE 20000
 
/************************************************************************/
/*                      希尔排序                                        */
/************************************************************************/
void shellSort(SqList *pL)
{
int i,j;
int step; //步长
    int temp;
 
step = pL->length/2;
 
while(step >=1)
{
for(i = step;i<pL->length;i++)
{
            temp = pL->r[i];
for (j = i-step;j>=0 && temp < pL->r[j];j=j-step)
{
pL->r[j+step] = pL->r[j];
}
pL->r[j+step] = temp;
}
step = step/2;
}
}
 
 
//排序方法耗时比较
void pk(SqList *pL)
{
    long dwStart,dwEnd;
    SqList sqList1,sqList2,sqList3,sqList4;
SqList sqList5,sqList6;
    
memcpy(&sqList1,pL,sizeof(SqList));
memcpy(&sqList2,pL,sizeof(SqList));
    memcpy(&sqList3,pL,sizeof(SqList));
memcpy(&sqList4,pL,sizeof(SqList));
memcpy(&sqList5,pL,sizeof(SqList));
memcpy(&sqList6,pL,sizeof(SqList));
 
dwStart  = timeGetTime();
    shellSort(&sqList6);
dwEnd = timeGetTime();
printf("shellSort:%d\n",dwEnd-dwStart);
 
dwStart  = timeGetTime();
    InsertSort(&sqList4);
dwEnd = timeGetTime();
printf("InsertSort:%d\n",dwEnd-dwStart);
 
dwStart  = timeGetTime();
    selectSort(&sqList5);
dwEnd = timeGetTime();
printf("selectSort:%d\n",dwEnd-dwStart);
}
===============================================
shellSort:15
InsertSort:844
selectSort:1235
总结:
两万条记录的排序,shell排序仅仅15ms,仅仅是直接插入排序的七十分之一,速度相对惊人。
shell真是牛人。
shell排序,里面有分治的思想,它的实质还是插入排序;区别在于它设置了一个步长,每次跨一个步长去比较。
步长逐步减少到1,到1的时候,就是直接插入排序了。
posted on 2013-06-30 16:54  转身的老虎  阅读(346)  评论(0编辑  收藏  举报