十大排序——希尔排序
希尔排序
基本思想
希尔排序本质也是插入排序,又称缩小增量排序但效率打破了O(n^2)。
希尔排序是将待排序序列分成若干个小序列,并对这些小序列进行直接插入排序,待整个序列都保持“基本有序”时再对整体进行一次直接插入排序。
例子
上面这个示意图正是希尔排序的实例,希尔排序通过每一小块的直接插入排序,并缩小增量,对更小的块进行直接插入排序,从而最后得到的必然是基本有序的序列,再进行一次直接插入排序,从而确定整个序列。
实现代码
采用的是除2法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18void ShellSort(List &L)
{
int i,j,temp;
int d=L.size/2;
while(d>0)
{
for(i=d;i<L.size;i++)
{
temp=L[i];
for(j=i-d;j>=0&&temp<L[j];j-=d)
{
L[j+d]=L[j];
}
L[j+d]=temp; //因为j-=d所以+d
}
d=d/2;
}
}
算法复杂度
希尔排序的时间复杂度现在依然是个数学难题,不过肯定比冒泡、选择这些用空间换时间的要好,空间复杂度为O(1)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Conzxy's blog!
评论