希尔排序,速度相当快
//程序中缺少的结构、函数请在上一篇博客里查找
#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的时候,就是直接插入排序了。