前面我曾经提到过冒泡排序与选择排序,今天我来介绍一种新的排序方法——希尔排序。
前面提到的冒泡排序和选择排序,其算法复杂度均为o(n^2),就性能而言,选择排序还是要略高于冒泡排序的。今天提到的希尔排序时间复杂度为o(n^(3/2)),是较高级的一种算法。
希尔算法原理:
通过设置一个增量,进行跳跃式的比较,实现基本有序,即小的数基本在前面,大的数基本在后面。这样在一定程度上,使得时间复杂度降低。希尔排序最主要的地方在于,它将关键字较小的记录,不是一步一步的往前挪移,而是跳跃式的往前移动,这就使得在完成一轮循环,使得整个算法坚定的朝着有序迈进。
具体代码如下:
void shellsort (sqlist *l)
{
int i,j;
int crement=l->length;
do
{
increment=increment/3+1;//增量序列
for(i=crement+1;i<=l->length;i++)
{
if(l->r[i]<l->[i-incremnt])
{
l->r[0]=l->r[i];//暂存在l->r[0];
for(j=i-increment;j>0&&l->r[0]<l->r[j];j-=increment)
l->r[j+increment]=l->r[j];//记录后移,寻找要插入的位置
l->r[j+increment]=l->r[0];//实现插入
}
}
}
while(increment>1);
}