原理:
shell排序基于直接插入排序改进,把整个序列分割成多个部分进行插入排序,在进行子序列合并,在进行插入排序;这样减少移动空间次数。
shell排序功能函数:
void shell_sort(sqlist_t *q)
{
int i, j;
int count = q->last;
do
{
count = count/3 + 1; //增量序列
for(i = count +1; i < q->last; i++)
{
if(q->data[i - count] > q->data[i])
{
//需将q->data[i]插入有序增量子表
q->data[0] = q->data[i]; //暂存q->data[0]
for(j = i-count; j>0 && q->data[0] < q->data[j]; j -= count)
q->data[j+count] = q->data[j]; //记录后移,查找插入位置
q->data[j+count] = q->data[0]; //插入
}
}
}
while(count > 1);
}
执行函数:
int main(int argc, char *argv[])
{
srand(time(NULL));
sqlist_t *q = sqlist_create();
for(int i = 1; i < 10; i++)
q->data[i] = rand() % 100;
printf("\n");
for(int i = 1; i < 10; i++)
printf("%3d ",q->data[i]);
printf("\n");
shell_sort(q);
for(int i = 1; i < 10; i++)
printf("%3d ",q->data[i]);
printf("\n");
return 0;
}
运行结果:
.3);最坏的时间复杂度为O(n^2)。