shell(希尔)排序简要讲解
在学习一个算法以前,我们先了解一下这个算法的一些历史发展。
现在,我要讲解的算法叫希尔排序(Shell Sort)。希尔排序是 D.L.Shell 于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n^2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。
shell排序是基于直接插入排序改进的,所以在学习shel排序l算法以前先去学习了解直接插入排序算法,这样可以更好的理解shell 排序算法
直接插入排序的思想是:构建一个有序的序列,把新的数字插入到有序序列当中。直接插入排序到问题在于:每次插入都会移动大量空间,造成时间复杂度过大。直接插入排序到时间复杂度为O(n^2)。
shell排序基于直接插入排序改进:把整个序列分割为多个部分进行插入排序,然后再进行子序列合起来,再进行直接插入排序;这样,减少移动空间次数。直接插入排序的平均时间复杂度O(n1.3);最坏的时间复杂度为O(n2)。
下面是算法实现的简单c语言代码
void shellsort(sqlist_t *L)
{
int i,j;
int increment=L->last+1;
do
{
increment=increment/3+1;//每轮比较间隔,也叫增量序列
for(i=increment;i<=L->last;i//i的起始位置以及结束条件需要符合你传入的L这个顺序表
{
if(L->data[i]<L->data[i-increment])
{
int temp=L->data[i];//将data[i]的位置空出来,将值暂存在temp中
//j的结束位置需要符合你传入的L这个顺序表
for(j=i-increment;j>=0&&L->data[j]>temp;j-=increment)
{
L->data[j+increment]=L->data[j];
}
L->data[j+increment]=temp;
}
}
}while(increment>1);
return ;
}
/*
结构体sqlist_t如下
typedef int data_t;
typedef struct
{
data_t data[MAXSIZE];
int last=-1;
}sqlist_t;
*/
文章最后:这是来自一个正在学习的新码农,如有错误,望指正。